GitHub 中文社区网络请求iOS学习

NSURLSession官方文档阅读

2017-06-01  本文已影响165人  AppleTTT

NSURLSession

本来是准备看下 YTKNetwork 的架构的,但是大致看了下,只是对AFNetworking的浅层封装,做的东西不太多,于是想想 NSURLSession 我也不是很熟悉,所以准备先复习下这段知识,然后再去看下 AFN 源码,希望可以从这些源码里面学到更多的东西;

以下基本上对于官方文档的一个翻译,结合谷歌翻译和我自己的理解:

URL会话类层次结构

NSURLSession API由以下类(嵌套以显示子类关系)组成:

作用
NSURLSession Session对象。
NSURLSessionConfiguration 初始化会话时使用的配置对象。
NSURLSessionTask 会话中任务的基类。
NSURLSessionDataTask 用于检索URL的内容作为NSData对象的任务
NSURLSessionUploadTask 用于上传文件的任务,然后将URL的内容检索为NSData对象
NSURLSessionDownloadTask 将URL的内容检索为磁盘上的临时文件的任务
NSURLSessionStreamTask 用于建立TCP / IP连接的任务

此外,NSURLSession API提供了四种协议,定义了应用程序可以实现的委托方法,以便对会话和任务行为提供更细粒度的控制。

代理 作用
NSURLSessionDelegate 定义处理会话级事件的委托方法
NSURLSessionTaskDelegate 定义委托方法来处理所有任务类型通用的任务级别事件
NSURLSessionDataDelegate 定义委托方法来处理特定于数据和上传任务的任务级事件
NSURLSessionDownloadDelegate 定义委托方法来处理特定于下载任务的任务级事件
NSURLSessionStreamDelegate 定义委托方法来处理特定于流任务的任务级事件

最后,NSURLSession API使用了很多类,它们也常用于其他API,如NSURLConnection和NSURLDownload。其中一些共享类包括:

作用
NSURL 包含URL的对象。
NSURLRequest 封装与URL请求相关的元数据,包括URL,请求方法等。
NSURLResponse 封装与服务器对请求的响应相关的元数据,例如内容MIME类型和长度。
NSHTTPURLResponse 添加特定于HTTP请求的其他元数据,如响应头。
NSCachedURLResponse 封装NSURLResponse对象以及服务器响应的实际主体数据,以实现高速缓存。

身份验证和定制TLS

当服务器在TLS协商期间请求身份验证或提供认证时,URL会话将调用委托方法,从而允许我们以自定义方式处理身份验证或证书验证。它所调用的方法取决于我们是处理特定任务的挑战还是会话范围的挑战(challenges)。下表显示了两者之间的差异。

Session-wide challenges Task-specific challenges
NSURLAuthenticationMethodNTLM:对此保护空间使用NTLM身份验证 NSURLAuthenticationMethodDefault:使用协议的默认身份验证方法
NSURLAuthenticationMethodNegotiate:协商是否对此保护空间使用Kerberos或NTLM身份验证 NSURLAuthenticationMethodHTTPBasic:对此保护空间使用HTTP基本身份验证
NSURLAuthenticationMethodClientCertificate:对此保护空间使用客户端证书身份验证 NSURLAuthenticationMethodHTTPDigest:对此保护空间使用HTTP摘要验证
NSURLAuthenticationMethodServerTrust:对此保护空间执行服务器信任身份验证(证书验证)

对于特定于任务的挑战,会话调用其委托的 URLSession:task:didReceiveChallenge:completionHandler:method。

对于会话范围的身份验证挑战,会话调用其委托的 URLSession:didReceiveChallenge:completionHandler:method,如果该方法存在。否则,它调用委托的URLSession:task:didReceiveChallenge:completionHandler:method。

如果不实现这些方法,当请求需要客户端认证时,URL会话将尝试进行如下认证:

1. 使用作为请求的 URL 的一部分提供的认证信息(如果可用)
2. 通过在用户的钥匙串(macOS)或应用程序的钥匙串(在iOS中)查找 Internet 密码和证书,
3. 如果凭据不可用,或者服务器拒绝凭据,连接将继续而不进行身份验证。对于HTTP和HTTPS请求,连接尝试失败并具有适当的 HTTP 状态代码,并可能提供备用内容(例如私有站点的公开版本)。对于其他 URL 类型(如FTP),连接失败,连接失败。

注意:Kerberos身份验证是透明的。这里描述的委托方法不适用于Kerberos身份验证。

App Transport Security (ATS)

从iOS 9.0和OS X v10.11开始,默认情况下,对 NSURLSession 进行的所有 HTTP 连接都启用了一个名为 App Transport Security(ATS)的新安全功能。 ATS 要求 HTTP 连接使用HTTPS(RFC 2818)。

有关详细信息,请参阅信息属性列表键参考中的 NSAppTransportSecurity。

使用URL会话

使用 NSURLSession 类做网络请求:

1. 创建会话配置。对于后台会话,此配置必须包含一个唯一的标识符。存储该标识符,如果我们的应用程序崩溃或终止或暂停,则使用该标识符重新关联会话。
2. 创建会话,指定配置对象,以及可选的代理。
3. 在会话中创建每个表示资源请求的任务对象。这些任务对象是 NSURLSessionTask-NSURLSessionDataTask,NSURLSessionUploadTask 或
   NSURLSessionDownloadTask的子类,具体取决于我们尝试实现的行为。

每个任务开始处于暂停状态。在任务的应用程序调用恢复之后,它开始下载指定的资源。

开始一个任务后,会话将调用它的委托方法,如下所示:

1. 如果与服务器的初始握手需要连接级别的认证(如SSL客户端证书),则NSURLSession会调用URLSession:task:didReceiveChallenge:completionHandler:或
URLSession:didReceiveChallenge:completionHandler:delegate方法,就像上面的 Authentication 和定制 TLS 。

有关编写 NSURLSession 的认证代理方法的更多信息,请参阅 URL 会话编程指南。

2. 如果任务的数据是从流中提供的,NSURLSession 对象将调用代理的 URLSession:task:requireNewBodyStream:delegate 方法来获取提供新请求的正文数据的
NSInputStream 对象。

3. 在将主体内容初次上传到服务器(如果适用)时,代理会定期接收 URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:   
报告上传进度的回调。

4. 服务器返回数据。

5. 如果响应指示需要验证,则会话将调用其委托的URLSession:task:didReceiveChallenge:completionHandler:method。回到步骤2。

6. 如果响应是HTTP重定向响应,则NSURLSession对象调用委托的URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:method。   
该委托方法使用提供的NSURLRequest对象(跟随重定向),新的NSURLRequest对象(重定向到不同的URL)或nil(将重定向的响应体视为有效响应并将其返回)来调用提供的
完成处理程序作为结果)。
    a.如果决定遵循重定向,请返回步骤2。
    b.如果代理没有实现此方法,则重定向将跟随到最大重定向数。

7. 对于通过调用downloadTaskWithResumeData或downloadTaskWithResumeData:completionHandler:创建的(重新)下载任务,NSURLSession会使用新的任务对象  
调用委托的URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:method。
   
8. 对于数据任务,NSURLSession对象调用代理的URLSession:dataTask:didReceiveResponse:completionHandler:方法来决定是否将数据任务转换为 
下载任务,然后调用完成回调继续接收数据或下载数据。

如果应用选择将数据任务转换为下载任务,NSURLSession将以新的下载任务作为参数,调用委托的URLSession:dataTask:didBecomeDownloadTask:方法。在
此调用之后,代理不会从数据任务中接收到进一步的回调,并从下载任务开始接收回调。

9. 在从服务器传输过程中,代表定期收到一个任务级回调,以报告传输的进度。

对于数据任务,会话将调用委托的URLSession:dataTask:didReceiveData:方法并收到实际的数据段。

对于下载任务,会话调用委托的URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:方法,其成功写入磁盘的字节数。如果用户想要程序暂停下载,可以调用cancelByProducingResumeData:方法取消任务。

如果用户要求应用恢复下载,可以将已经下载的数据传递给downloadTaskWithResumeData或downloadTaskWithResumeData:completionHandler:方法,以创建一个继续下载的新的下载任务。 (转到步骤1.)

10. 对于数据任务,NSURLSession对象可以调用委托的URLSession:dataTask:willCacheResponse:completionHandler:方法来决定是否允许缓存。如果不实现此方法,则默认行为是使用会话配置对象中指定的缓存策略。

如果响应是多部分编码的,则会话可以再次调用委托的didReceiveResponse方法,其次是零个或多个额外的didReceiveData调用。如果发生这种情况,请转到步骤8(处理didReceiveResponse调用)。

11. 如果下载任务成功完成,则NSURLSession对象会调用任务的URLSession:downloadTask:didFinishDownloadingToURL:方法,其中包含临时文件的位置。你必须从此文件读取响应数据或将其移动到永久位置,然后再转发该代理方法。

12. 任何任务完成后,NSURLSession对象将调用委托的URLSession:task:didCompleteWithError:方法,此方法将会返回一个NSError对象或nil(如果任务已成功完成)。

13. 如果可以恢复下载任务,则NSError对象的userInfo字典包含NSURLSessionDownloadTaskResumeData对应的值。我们应该应传递此值以调用downloadTaskWithResumeData:或downloadTaskWithResumeData:completionHandler:创建一个新的下载任务来继续现有下载任务。

如果该任务无法恢复,我们应该创建一个新的下载任务,并从头开始重新启动事务。

在任一种情况下,如果传输由于服务器错误以外的任何原因而失败,请转到步骤3(创建和恢复任务对象)。
   
NOTE:
NSURLSession不通过error参数报告服务器错误。我们的委托通过错误参数收到的唯一错误是客户端错误,例如无法解析主机名或连接到主机。错误代码在URL加载系统错误代码中描述。
服务器端错误通过NSHTTPURLResponse对象中的HTTP状态代码报告。有关更多信息,请阅读有关NSHTTPURLResponse和NSURLResponse类的文档。

14. 如果不再需要会话,可以通过调用invalidateAndCancel(取消未完成的任务)或finishTasksAndInvalidate(在对象无效之前使未完成的任务完成)来使其无效。如果不使会话无效,当应用程序终止时,它会自动消失(除非是正在处理任务的后台会话)。

会话无效后,当所有未完成的任务已被取消或已完成时,会话将调用委托的URLSession:didBecomeInvalidWithError:方法。当代理方法返回时,session会销毁对代理的强引用。


如果应用取消正在进行的下载,NSURLSession对象会调用委托的URLSession:task:didCompleteWithError:方法,就像发生错误一样。   
 

后台任务调用注意事项

因为重新启动应用程序(或等待用户重新启动它)相对昂贵,某些功能在后台会话中不可用。因此:

1. session必须提供一个委托来进行事件传递。因为应用可能会在调用过程中退出并重新启动,因此完成的回调并不会执行。 (对于上传和下载,这些代理行为与进程内调用相同)。
2. 只支持HTTP和HTTPS协议。不支持其他内置网络协议,也不支持自定义网络协议。
3. 只支持上传和下载任务(数据任务也不行)。
4. 重定向始终遵循。
5. 系统并发的后台调用任务的数量有限。
6. 如果后台任务无法满足系统指定的吞吐量限制,则可能会取消后台任务。也就是说,如果长时间运行的任务在一段时间内没有发送或接收足够的数据,则可能会被取消以便稍后恢复。因此,如果可能的话,进行调用恢复是很重要的。
7. 如果后台调用在应用程序处于后台时启动,则任务被视为自由决定的。换句话说,它的行为就像会话中的一个任务,其配置对象的discretionary属性(一个布尔值,用于确定后台任务是否可以由系统自行调度以获得最佳性能)为true。

如果这些限制与应用程序的需求不兼容,我们可以将远程资源下载到非后台会话中的文件。如果这样做,那么当用户将iOS应用程序置于后台或退出MacOS应用程序时,通过调用cancelByProducingResumeData:方法暂停任何活动的下载。当用户再次将应用转移到前台时,恢复下载。如果应用在获取之前数据之前被终止,那么用户将无法恢复下载。

NOTE:
后台会话被优化用于传送少量可以根据需要恢复的大量资源。 如果可能,您可能需要调查优化服务器端行为以促进此类用法的方法,例如:

1. 向端点发送或接收zip或tar存档,而不是进行多个单独请求。
2. 向终端发出请求,发送或接收客户端和服务器之间的增量差异。
3. 向返回上传标识符的端点发出请求,然后可以将其用于跟踪和恢复向服务器传输数据。
4. 添加一个将请求代理到规范Web服务的中间Web服务,以便于上述任何优化。

NSCopying行为

会话和任务对象符合NSCopying协议,如下所示:

1.当您的应用程序复制会话或任务对象时,您会收到相同的对象。
2.当您的应用程序复制配置对象时,您将获得可以独立修改的新副本。

线程安全

URL会话API本身是完全线程安全的。 我们可以在任何线程上下文中自由创建会话和任务,并且当我们调用代理方法里面提供的完成的回调是,系统会自动将此回调安排在正确的队列中。

警告
URLSessionDidFinishEventsForBackgroundURLSession:代理方法可能会在子线程中调用。 但是,在iOS中,在改代理方法的实现中,我们可能会调用application:handleEventsForBackgroundURLSession:completionHandler:app代理方法。 这个方法里面的completion回调必须在主线程上调用

一些方法


Creating a Session
+ sessionWithConfiguration: 使用指定的配置去创建session,实际调用的是下面的方法;
+ sessionWithConfiguration:delegate:delegateQueue:使用指定的配置,代理和代理实现的队列去初始化一个session
(class) sharedSession 返回一个session的单例

Configuring a Session
1. configuration 
    session 的配置对象的副本;用来指定session的某些行为,例如缓  存策略,超时,代理,管道流,支持的TLS版本,cookie策略,认证存储等。(我会用一章专门翻译下这个 configuration)
2. delegate 
    此代理对象负责处理身份认证,缓存决策以及处理其他与会话相关的事件。 会话对象保持对此代理的强引用,直到用程序退出或显式使会话无效。 如果不使会话无效,则会出现内存泄露的问题直到程序退出。
NOTE:此代理只能在 session 创建的时候设置,并且不能改变;
3. delegateQueue 
    用于代理方法调用和完成block回调的操作队列。 队列必须是串行队列,以确保回调的顺序。 如果没有,会话将创建一个串行操作队列,用于执行上述操作。
4. sessionDescription  
    debug时用的描述语句,默认为nil;
Adding Data Tasks to a Session
1. - dataTaskWithURL: 
    创建一个获取指定URL内容的任务;创建任务后,必须通过调用其resume方法来启动它。 启动后会调用session的代理方法,在代理方法里面我们可以获取到元数据和响应数据等。

2. - dataTaskWithURL:completionHandler: 
    创建一个获取指定URL内容的任务,然后在完成时调用completionHandler;该任务绕过用于响应和数据传递的代理方法的调用,而是在completionHandler内提供NSData,NSURLResponse和NSError。 然而,处理身份认证的代理方法仍然会被调用。如果completionHandler为空,则代理方法会在任务完成后才执行,这时候调用此方法跟调用- dataTaskWithURL:方法一样。completionHandler在delegate queue上执行,它的组成如下:
    a. data 服务器返回的数据;
    b. response 提供响的应元数据,如HTTP头部和状态码。 如果进行的是HTTP或HTTPS请求,则返回的对象实际上是一个NSHTTPURLResponse对象。
    c.为什么请求失败的错误对象 ,若请求成功则为nil;
    
    创建任务后,必须通过调用其resume方法来启动它。
    只有在其代理实现了URLSession:dataTask:didReceiveData:方法的session中completionHandler才可以为nil。
    如果请求成功完成,则completionHandler的参数包含资源数据,并且error参数为nil。 如果请求失败,则data参数为nil,error参数包含有关错误的信息。 如果接收到来自服务器的响应,无论请求是否成功完成或失败,response参数都包含该信息。

3. - dataTaskWithRequest:
    request:提供特定请求信息的对象(例如URL,缓存策略,请求类型和请求body数据或body流)。
    通过基于NSURLRequest对象创建任务,我们可以调整任务各种行为,包括缓存策略和超时间隔。
    
    创建任务后,必须通过调用其resume方法来启动它。
    
4. - dataTaskWithRequest:completionHandler:
    结合 - dataTaskWithURL:completionHandler:  和 - dataTaskWithRequest: 查看即可;
Adding Download Tasks to a Session
1. - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url
    创建一个下载任务,获取指定URL的内容并将结果保存到文件中。
    
    创建任务后,必须通过调用其resume方法来启动它。

2. - (NSURLSessionDownloadTask *)downloadTaskWithURL:(NSURL *)url completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
     创建一个获取指定URL内容的任务,然后在完成时调用completionHandler;该任务绕过用于响应和数据传递的代理方法的调用,而是在completionHandler内提供NSData,NSURLResponse和NSError。 然而,处理身份认证的代理方法仍然会被调用。如果completionHandler为空,则代理方法会在任务完成后才执行,这时候调用此方法跟调用-downloadTaskWithURL:方法一样。completionHandler在delegate queue上执行,它的组成如下:
    a. location 存储服务器响应的临时文件的位置。 在completionHandler返回之前,必须移动此文件或打开它才能查看。 否则,文件会被删除,数据将丢失;
    b. response 提供响的应元数据,如HTTP头部和状态码。 如果进行的是HTTP或HTTPS请求,则返回的对象实际上是一个NSHTTPURLResponse对象。
    c.为什么请求失败的错误对象 ,若请求成功则为nil;
    
    创建任务后,必须通过调用其resume方法来启动它。
    只有在其代理实现了 URLSession:downloadTask:didFinishDownloadingToURL:方法的session中completionHandler才可以为nil。
    如果请求成功完成,则completionHandler的参数包含资源数据,并且error参数为nil。 如果请求失败,则data参数为nil,error参数包含有关错误的信息。 如果接收到来自服务器的响应,无论请求是否成功完成或失败,response参数都包含该信息。
    
3. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
      通过基于NSURLRequest对象创建任务,我们可以调整任务各种行为,包括缓存策略和超时间隔。
      
    创建任务后,必须通过调用其resume方法来启动它。该任务调用会话的代理方法来提供进度信息,生成的临时文件的位置等。  
    
4. - (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
    结合上面两个方法查看即可;
    
5. - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData
    创建一个下载任务以恢复以前取消或失败的下载任务。
    resumeData:提供恢复下载所需数据的数据对象。
    此方法相当于downloadTaskWithResumeData:completionHandler:方法的downloadTaskWithResumeData:completionHandler为nil。 有关详细的使用信息,包括获取恢复数据对象的方法,请参阅下面的方法。
    
6. - (NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData *)resumeData completionHandler:(void (^)(NSURL *location, NSURLResponse *response, NSError *error))completionHandler
    创建一个下载任务以恢复以前取消或失败的下载任务,然后在完成时调用completionHandler;该任务绕过用于响应和数据传递的代理方法的调用,而是在completionHandler内提供NSData,NSURLResponse和NSError。 然而,处理身份认证的代理方法仍然会被调用。关于参数可以结合上面的方法看下;
    只有当session的代理实现了 URLSession:downloadTask:didFinishDownloadingToURL: 方法的时候,你才可以将completionHandler设置为nil;
    我们可以通过以下两种方式获取resumeData对象:
        a. 如果我们通过调用cancelByProducingResumeData:方法来取消现有的下载任务,那么session会通过cancelByProducingResumeData:方法的completionHandler来传递resumeData,然后你可以根据此resumeData继续下载任务
        b. 如果传输失败,则session向其代理或completionHandler提供NSError对象。在该对象中,userInfo字典中的NSURLSessionDownloadTaskResumeData键对应着一个resumeData对象。
        
    创建任务后,您必须通过调用其resume方法来启动它。
    如果请求成功完成,则completionHandler参数包含临时文件的位置,并且错误参数为nil。如果请求失败,则location参数为nil,error参数包含有关错误的信息。如果接收到来自服务器的响应,无论请求是否成功完成或失败,response都包含该信息。
    
    NOTE:只有当HTTP或HTTPS的GET请求才能恢复下载,并且仅当服务器支持byte-range请求(带有Range头),并在其响应中提供ETag或Last-Modified头。如果服务器上的文件已被修改,或者由于磁盘空间不足而临时文件被删除,则下载也可能会重新启动。

Adding Upload Tasks to a Session
1. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData
    创建一个为指定的HTTP请求并上传数据的任务;
    request:通过基于NSURLRequest对象创建任务,我们可以调整任务各种行为,包括缓存策略和超时间隔。request对象的body流和body数据会被忽略;
    bodyData:给request参数的body数据;
    任何包含body的request都可以作为一个HTTP上传request,比如POST或者PUT请求,上传任务需求我们提供一个request以便我们提供上传的元数据,比如HTTP请求头;
    
    创建任务后,必须通过调用其resume方法来启动它。 该任务调用代理方法,为我们提供上传的进度,响应元数据,响应数据等信息。

2. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromData:(NSData *)bodyData completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler
    跟上面那些方法一样,都是绕过代理的一些方法,在回调中返回数据;completionHandler在delegateQueue中执行,如果我们传nil给completionHandler,则当任务完成时才会调用代理方法,此时此方法与上面1方法一样;completionHandler的参数如下:
    a. data: 服务器返回的数据;
    b. response 提供响的应元数据,如HTTP头部和状态码。 如果进行的是HTTP或HTTPS请求,则返回的对象实际上是一个NSHTTPURLResponse对象。
    c.为什么请求失败的错误对象 ,若请求成功则为nil;
    
    创建任务后,须通过调用其resume方法来启动它。
    只有当代理实现了URLSession:dataTask:didReceiveData: 方法的时候,我们才可以传递nil给completionHandler;当我们不需要返回的数据的时候,可以通过KVO来检测任务状态来确定任务何时完成;
    如果请求成功完成,则completionHandler参数包含临时文件的位置,并且错误参数为nil。如果请求失败,则location参数为nil,error参数包含有关错误的信息。如果接收到来自服务器的响应,无论请求是否成功完成或失败,response都包含该信息。

3. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL
    与1类似,创建一个上传指定文件的HTTP请求任务;
    fileURL: 要上传的文件的URL;

4. - (NSURLSessionUploadTask *)uploadTaskWithRequest:(NSURLRequest *)request fromFile:(NSURL *)fileURL completionHandler:(void (^)(NSData *data, NSURLResponse *response, NSError *error))completionHandler
    参考2;
    
Adding Stream Tasks to a Session
1. - (NSURLSessionStreamTask *)streamTaskWithHostName:(NSString *)hostname port:(NSInteger)port
    创建一个双向的TCP/IP连接到指定主机和端口的任务;
    hostname: 连接的主机名;
    port: 连接的端口;
    
    创建任务后,须通过调用其resume方法来启动它。

2. - (NSURLSessionStreamTask *)streamTaskWithNetService:(NSNetService *)service
    通过指定的网络服务来创建一个双向的TCP/IP连接任务;
    service:NSNetService类代表一个网络服务。这个类和NSNetServiceBrowser使用组播DNS来传送网络服务相关的信息。 NSNetService的API提供了一种方便的方式来发布应用提供的服务并解析服务的socket地址。
    
    创建任务后,须通过调用其resume方法来启动它。

Managing the Session
1. - (void)finishTasksAndInvalidate
    使session无效,允许任何未完成的任务完成。
    此方法立即返回而不等待任务完成。 会话无效后,无法在会话中创建新任务,但是现有任务会一直持续到完成。 在最后一个任务完成并且会话进行与这些任务相关的最后一个代理调用之后,该会话在其代理上调用URLSession:didBecomeInvalidWithError:方法,然后中断对代理和回调对象的引用。 无效后,会话对象无法重复使用。

    要取消所有未完成的任务,请改用invalidateAndCancel。

    NOTE:在sharedSession方法返回的会话上调用此方法没有任何作用。

2. - (void)flushWithCompletionHandler:(void (^)(void))completionHandler;
    将Cookie和证书刷新到磁盘,清除临时高速缓存,并确保将来的请求发生在新的TCP连接上;
    completionHandler:刷新操作完成时的回调。 该处理程序在delegateQueue中执行。

3. - (void)getTasksWithCompletionHandler:(void (^)(NSArray<NSURLSessionDataTask *> *dataTasks, NSArray<NSURLSessionUploadTask *> *uploadTasks, NSArray<NSURLSessionDownloadTask *> *downloadTasks))completionHandler
    在会话中异步调用completion回调和所有数据,上传和下载任务。
    返回的数组包含在session中创建的任何任务但不包括任何在完成,失败或被取消后无效的任务。

4. - (void)invalidateAndCancel
    取消所有未完成的任务,然后使会话无效。
    一旦无效,对代理和回调对象的引用就会被破坏。 无效后,会话对象无法重复使用。
    要允许未完成的任务运行直到完成,请改用finishTasksAndInvalidate。

    NOTE:在sharedSession方法返回的会话上调用此方法没有任何作用。

5. - (void)resetWithCompletionHandler:(void (^)(void))completionHandler
    清空所有Cookie,缓存和证书存储,删除磁盘文件,将正在进行的下载刷新到磁盘,并确保将来的请求发生在新的socket上。

Constants
1. 与NSURLSession API返回的NSError对象结合使用的键:
    a. NSURLSessionDownloadTaskResumeData:继续下载的resume数据.
    b. NSURLErrorBackgroundTaskCancelledReasonKey: 指示为什么后台任务被取消一个NSNumber值。
    
2. 后台任务取消的原因:
    a. NSURLErrorCancelledReasonUserForceQuitApplication:操作已被取消,因为用户强制应用退出。
    b. NSURLErrorCancelledReasonBackgroundUpdatesDisabled:由于后台更新被禁用,操作被取消。 有关详细信息,请参Background Execution。
    c. NSURLErrorCancelledReasonInsufficientSystemResources:系统资源不足
    
3. 传输大小问题:
    NSURLSessionTransferSizeUnknown:传输的总大小无法确定。
    
Instance Methods
1. - (void)getAllTasksWithCompletionHandler:(void (^)(NSArray<__kindof NSURLSessionTask *> *tasks))completionHandler
    这个苹果的文档都没给出任何信息,看头文件里面的注释表示回调中参数表示所有为完成的task;


上一篇下一篇

猜你喜欢

热点阅读