zoukankan      html  css  js  c++  java
  • NSURLSession学习笔记(一)简介

    一、URL Session的基本概念

    1.三种工作模式:

    默认会话模式(default):工作模式类似于原来的NSURLConnection,使用的是基于磁盘缓存的持久化策略,使用用户keychain中保存的证书进行认证授权。

    瞬时会话模式(ephemeral):该模式不使用磁盘保存任何数据。所有和会话相关的caches,证书,cookies等都被保存在RAM中,因此当程序使会话无效,这些缓存的数据就会被自动清空。

    后台会话模式(background):该模式在后台完成上传和下载,在创建Configuration对象的时候需要提供一个NSString类型的ID用于标识完成工作的后台会话。

    2.NSURLSession支持的三种任务

    NSURLSession类支持三种类型的任务:加载数据,下载和上传。

    二、相关的类

    NSURLConnection这个名字,实际上指的是一组构成Foundation框架中URL加载系统的相互关联的组件:NSURLRequest,NSURLResponse,NSURLProtocol,NSURLCache,NSHTTPCookieStorage,NSURLCredentialStorage,以及和它同名的NSURLConnection。

    在WWDC 2013中,Apple的团队对NSURLConnection进行了重构,并推出了NSURLSession作为替代。

    NSURLSession也是一组相互依赖的类,它的大部分组件和NSURLConnection中的组件相同如NSURLRequest,NSURLCache等。而NSURLSession的不同之处在于,它将NSURLConnection替换为NSURLSession和NSURLSessionConfiguration,以及3个NSURLSessionTask的子类:NSURLSessionDataTask, NSURLSessionUploadTask, 和NSURLSessionDownloadTask。

    下面来说下NSURLSession新推出的类:

    1.NSURLSessionConfiguration类

    其中NSURLSessionConfiguration用于配置会话的属性,可以通过该类配置会话的工作模式:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. + (NSURLSessionConfiguration *)defaultSessionConfiguration;  
    2. + (NSURLSessionConfiguration *)ephemeralSessionConfiguration;  
    3. + (NSURLSessionConfiguration *)backgroundSessionConfiguration:(NSString *)identifier;  


    在backgroundSessionConfiguration:方法中的identifier参数指定了会话的ID,用于标记后台的session。

    该类的其中两个属性:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* allow request to route over cellular. */  
    2. @property BOOL allowsCellularAccess;  
    3.   
    4. /* allows background tasks to be scheduled at the discretion of the system for optimal performance. */  
    5. @property (getter=isDiscretionary) BOOL discretionary NS_AVAILABLE(NA, 7_0);  


    allowsCellularAccess 属性指定是否允许使用蜂窝连接, discretionary属性为YES时表示当程序在后台运作时由系统自己选择最佳的网络连接配置,该属性可以节省通过蜂窝连接的带宽。在使用后台传输数据的时候,建议使用discretionary属性,而不是allowsCellularAccess属性,因为它会把WiFi和电源可用性考虑在内。补充:这个标志允许系统为分配任务进行性能优化。这意味着只有当设备有足够电量时,设备才通过Wifi进行数据传输。如果电量低,或者只仅有一个蜂窝连接,传输任务是不会运行的。后台传输总是在discretionary模式下运行。

    2.NSURLSession类

    获取NSURLSession类对象有几种方式:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * The shared session uses the currently set global NSURLCache, 
    3.  * NSHTTPCookieStorage and NSURLCredentialStorage objects. 
    4.  */  
    5. + (NSURLSession *)sharedSession;  
    6.   
    7. /* 
    8.  * Customization of NSURLSession occurs during creation of a new session. 
    9.  * If you only need to use the convenience routines with custom 
    10.  * configuration options it is not necessary to specify a delegate. 
    11.  * If you do specify a delegate, the delegate will be retained until after 
    12.  * the delegate has been sent the URLSession:didBecomeInvalidWithError: message. 
    13.  */  
    14. + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration;  
    15. + (NSURLSession *)sessionWithConfiguration:(NSURLSessionConfiguration *)configuration delegate:(id <NSURLSessionDelegate>)delegate delegateQueue:(NSOperationQueue *)queue;  


    第一种方式是使用静态的sharedSession方法,该类使用共享的会话,该会话使用全局的Cache,Cookie和证书。

    第二种方式是通过sessionWithConfiguration:方法创建对象,也就是创建对应配置的会话,与NSURLSessionConfiguration合作使用。

    第三种方式是通过sessionWithConfiguration:delegate:delegateQueue方法创建对象,二三两种方式可以创建一个新会话并定制其会话类型。该方式中指定了session的委托和委托所处的队列。当不再需要连接时,可以调用Session的invalidateAndCancel直接关闭,或者调用finishTasksAndInvalidate等待当前Task结束后关闭。这时Delegate会收到URLSession:didBecomeInvalidWithError:这个事件。Delegate收到这个事件之后会被解引用。

    3.NSURLSessionTask类

    NSURLSessionTask是一个抽象子类,它有三个子类:NSURLSessionDataTask,NSURLSessionUploadTask和NSURLSessionDownloadTask。这三个类封装了现代应用程序的三个基本网络任务:获取数据,比如JSON或XML,以及上传和下载文件。

    下面是其继承关系:

    有多种方法创建对应的任务对象:

    (1)NSURLSessionDataTask

    通过request对象或url创建:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* Creates a data task with the given request.  The request may have a body stream. */  
    2. - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request;  
    3.   
    4. /* Creates a data task to retrieve the contents of the given URL. */  
    5. - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url;  


    通过request对象或url创建,同时指定任务完成后通过completionHandler指定回调的代码块:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * data task convenience methods.  These methods create tasks that 
    3.  * bypass the normal delegate calls for response and data delivery, 
    4.  * and provide a simple cancelable asynchronous interface to receiving 
    5.  * data.  Errors will be returned in the NSURLErrorDomain,  
    6.  * see <Foundation/NSURLError.h>.  The delegate, if any, will still be 
    7.  * called for authentication challenges. 
    8.  */  
    9. - (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  
    10. - (NSURLSessionDataTask *)dataTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  


    (2)NSURLSessionUploadTask

    通过request创建,在上传时指定文件源或数据源。

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* Creates an upload task with the given request.  The body of the request will be created from the file referenced by fileURL */  
    2. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL;  
    3.   
    4. /* Creates an upload task with the given request.  The body of the request is provided from the bodyData. */  
    5. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData;  
    6.   
    7. /* Creates an upload task with the given request.  The previously set body stream of the request (if any) is ignored and the URLSession:task:needNewBodyStream: delegate will be called when the body payload is required. */  
    8. - (NSURLSessionUploadTask *)uploadTaskWithStreamedRequest:(NSURLRequest *)request;  


    在创建upload task对象时,通过completionHandler指定任务完成后的回调代码块:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * upload convenience method. 
    3.  */  
    4. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  
    5. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler;  

    (3)NSURLSessionDownloadTask

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* Creates a download task with the given request. */  
    2. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request;  
    3.   
    4. /* Creates a download task to download the contents of the given URL. */  
    5. - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url;  
    6.   
    7. /* Creates a download task with the resume data.  If the download cannot be successfully resumed, URLSession:task:didCompleteWithError: will be called. */  
    8. - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData;  


    下载任务支持断点续传,第三种方式是通过之前已经下载的数据来创建下载任务。
    同样地可以通过completionHandler指定任务完成后的回调代码块:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* 
    2.  * download task convenience methods.  When a download successfully 
    3.  * completes, the NSURL will point to a file that must be read or 
    4.  * copied during the invocation of the completion routine.  The file 
    5.  * will be removed automatically. 
    6.  */  
    7. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  
    8. - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  
    9. - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler;  



    4.NSURLSessionDelegate和NSURLSessionTaskDelegate协议

    在协议的方法中可以完成各种各样的回调动作,如身份验证、完成任务后的动作、错误处理和后台任务完成的动作等。委托方法指定在NSURLSession中一定数量的字节传输使用int64_t类型的参数。

    这里只说下后台任务的一个委托方法:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. /* If an application has received an 
    2.  * -application:handleEventsForBackgroundURLSession:completionHandler: 
    3.  * message, the session delegate will receive this message to indicate 
    4.  * that all messages previously enqueued for this session have been 
    5.  * delivered.  At this time it is safe to invoke the previously stored 
    6.  * completion handler, or to begin any internal updates that will 
    7.  * result in invoking the completion handler. 
    8.  */  
    9. - (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session NS_AVAILABLE_IOS(7_0);  

    合作使用的ApplicationDelegate方法:

    [objc] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. // Applications using an NSURLSession with a background configuration may be launched or resumed in the background in order to handle the  
    2. // completion of tasks in that session, or to handle authentication. This method will be called with the identifier of the session needing  
    3. // attention. Once a session has been created from a configuration object with that identifier, the session's delegate will begin receiving  
    4. // callbacks. If such a session has already been created (if the app is being resumed, for instance), then the delegate will start receiving  
    5. // callbacks without any action by the application. You should call the completionHandler as soon as you're finished handling the callbacks.  
    6. - (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)())completionHandler NS_AVAILABLE_IOS(7_0);  


    将任务切换到后台之后,Session的Delegate不会再收到和Task相关的消息。当所有Task全都完成后,程序将被唤醒,并调用ApplicationDelegate的application:handleEventsForBackgroundURLSession:completionHandler:回调,在这里要为后台session(由background session的identifier标识)指定对应的回调代码块。

    随后,对于每一个完成的后台Task调用该Session的Delegate中的URLSession:downloadTask:didFinishDownloadingToURL:(成功的话)和URLSession:task:didCompleteWithError:(成功或者失败都会调用)方法做处理,以上的回调代码块可以在这里调用。

    http://blog.csdn.net/majiakun1/article/details/38133433

  • 相关阅读:
    HDU 2116 Has the sum exceeded
    HDU 1233 还是畅通工程
    HDU 1234 开门人和关门人
    HDU 1283 最简单的计算机
    HDU 2552 三足鼎立
    HDU 1202 The calculation of GPA
    HDU 1248 寒冰王座
    HDU 1863 畅通工程
    HDU 1879 继续畅通工程
    颜色对话框CColorDialog,字体对话框CFontDialog使用实例
  • 原文地址:https://www.cnblogs.com/geek6/p/4130728.html
Copyright © 2011-2022 走看看