NSURLSession学习笔记(一)简介

来源:互联网 发布:怪奇物语 知乎 编辑:程序博客网 时间:2024/05/10 06:16

一、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:(成功或者失败都会调用)方法做处理,以上的回调代码块可以在这里调用。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 华为mate8边缘有缝怎么办 手机系统占用运行内存大怎么办 安卓手机储存空间不足怎么办 手机显示系统空间不足怎么办 联系人存储已停止运行怎么办 荣耀note8听筒声音小怎么办 红米4x内存不足怎么办 安卓电视内存小怎么办 红米手机运行内存不足怎么办 红米手机存储空间不足怎么办 华为手机储存空间不足怎么办 大麦机顶盒遥控器丢了怎么办 大麦盒子总自动加软件怎么办 小米手机玩王者荣耀卡怎么办 荣耀8青春版信号差怎么办 华为mate8电池不耐用怎么办 华为4x内存小怎么办 发现手机被用过怎么办 华为p8手机声音小怎么办 手机指纹解锁密码忘了怎么办 华为p10黑色掉漆怎么办 金立手机导航信号弱怎么办 手机导航时gps信号弱怎么办 三星手机导航gps信号弱怎么办 小米5导航信号弱怎么办 华为手机导航gps信号弱怎么办 手机屏玻璃裂了怎么办 oppo音量键坏了怎么办 魅蓝手机屏幕碎了怎么办 手机钢化膜边缘有气泡怎么办 手机贴钢化膜边缘有气泡怎么办 苹果手机钢化膜边缘有气泡怎么办 手机膜里的水泡怎么办 膜贴好了有气泡怎么办 后档玻璃膜气泡怎么办 贴膜里面有灰尘怎么办 贴膜边缘不粘怎么办 贴膜时候的气泡怎么办 贴手机膜起泡了怎么办 手机膜起泡泡了怎么办 手机膜鼓起来了怎么办