NSURLSession

参考:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/URLLoadingSystem/URLLoadingSystem.html

https://developer.apple.com/library/ios/samplecode/SimpleBackgroundTransfer/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013416

 

NSURLSession:通过HTTP(s)下载内容,进行身份验证,并支持后台下载。

 


 

一个Session可以对应多个task,session与task都有不同类型。

 

session的类型

default session:使用持久化存储进行缓存。

ephemera session:使用内存进行临时缓存。

background session:类似default session,分离的线程处理数据传输。

 

task的类型

data tasks:NSData类型数据传递,不支持后台session。

download tasks:通常为file类型,支持session。

upload tasks:通常为file类型,支持background session。

 


 

系统提供代理优先级高于自定义代理;整个任务流程如下:

 

(一)URLSession生命周期与系统提供的代理间交互:

1,创建session configuration;

2,创建session;

3,创建task,调用resume开始任务;

4,下载中:

cancelByProductingResumeData:中断下载

downloadTaskWithResumeData:重新下载

或downloadTaskWithResumeData:completionHandler:创建新下载任务继续下载;

5,下载完成,调用completion handler;

下载错误显示在客户端,

服务端错现在在NSHTTPURLResponse 对象中;

6,session撤销:

invalidateAndCancel,取消未完成任务销毁session;

finishTasksAndInvalidate,待完成任务后

 

(二)RLSession生命周期与自定义代理间交互:

1,创建session configuration;

2,创建session;

3,创建task,调用resume开始任务;

4,远程服务器需要认证,并且认证是连接级别的:

4.1,session级别校验:

NSURLAuthenticationMethodNTLM,

NSURLAuthenticationMethodNegotiate,

NSURLAuthenticationMethodClientCertificate,

NSURLAuthenticationMethodServerTrust;

session调用:URLSession:didReceiveChallenge:completionHandler:

task调用:URLSession:task:didReceiveChallenge:completionHandler:

4.2,非session级别校验:

NSURLAuthenticationMethod…等其他方式

session调用:URLSession:task:didReceiveChallenge:completionHandler:

4.3,调用验证失败或任务数据来自流,调用URLSession:task:needNewBodyStream:

5,HTTP需要重定向:

URLSession:task:willPerformHTTPRedirection:newRequest:CompletionHandler:

6,对于download task的中断与续传:

中断方式1:downloadTaskWithResumeData:

中断方式2:downloadTaskWithResumeData:completionHandler:

session使用以下调用来创建新的download task来下载:

URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:

7,对于数据任务:

调用:URLSession:dataTask:didReceiveResponse:completionHandler:

数据任务转下载任务:URLSession:dataTask:didBecomeDownloadTask:

8,对于上传任务uploadTaskWithStreamedRequest:

调用:URLSession:task:needNewBodyStream

9,初始化上传body内容时:

调用URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:记录进度

10,下载进度:

数据:URLSession:dataTask:didReceiveData:

文件:URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:

中断文件下载:cancelByProducingResumeData:

断点续传:downloadTaskWithResumeData:或downloadTaskWithResumeData:completionHandler:

11,缓存策略:

URLSession:dataTask:willCacheResponse:completionHandler:

如果不实现此方法则使用默认缓存策略。

12,下载任务完成:

session调用:URLSession:downloadTask:didFinishDwonloadingToURL:

在此调用return前需要把文件移到应用程序沙盒程序的目录。

13,任何任务完成都调用以下:

URLSession:task:didCompleteWithError:

任务失败处理:

如果数据任务失败,不要理解重试,检查服务器可达性,直到可达再重新请求。

如果下载任务可以恢复,NSError对象的userInfo包含NSURLSessionDownloadTaskResumeDatakey,传递值来调用downloadTaskWithResumeData或downloadTaskWithResumeData:completionHandler:

如果下载任务不可恢复,需要重新创建下载任务然后重开事务。

总之,下载失败,验证不是服务器原因,都要创建任务并启动任务。

14,如果返回为多部件编码。。。

15,Session关闭:

invalidateAndCancel

finishTasksAndInvalidate

关闭后调用URLSession:didBecomeInvalidWithError。

 

(三)Session 在后台与Delgate的交互,Session中的Tasks在后台全部完成:

1,当Session中的Tasks全部完成后,调用Application Delegate中的application:handleEventsForBackgroundURLSession:completionHandler:

2,之后对每一个Task,调用Session Delegate中的

URLSession:downloadTask:didFinishDownloadingToURL: (成功的话) 和

URLSession:task:didCompleteWithError:(成功失败都会调用)

3,再之后,调用Session Delegate中的

URLSessionDidFinishEventsForBackgroupdURLSession:

4,步骤3的最后,需要调用步骤1的completionHandler Block。

 

posted on 2014-05-09 16:55  离群的野兽  阅读(967)  评论(0编辑  收藏  举报

导航