NSURLSession中的委托和完成处理程序

时间:2015-09-24 10:38:38

标签: ios objective-c ios9 nsurlsession

我有一种困惑。根据我的理解,Delegates和Completion Handler是两种不同的机制,可以使用其中任何一种来实现NSURLSession。 但是为什么下面的代表没有被称为

(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse  

但这被称为

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse 
completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler  

类似于didReceiveChallenge 什么时候

(void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data  
可以调用

,然后需要为didRecieveResponse显式添加完成处理程序 它确实不是必需的或是它的方式吗?
您能解释一下上面和一般情况下添加完成处理程序的目的是什么?

1 个答案:

答案 0 :(得分:1)

请参阅docs for the NSURLSessionDataDelegate,特别是注释:

  

请注意

     

NSURLSession对象不需要委托。如果未分配任何委托,则在该会话中创建任务时,必须提供完成处理程序块以获取数据。

     

完成处理程序块主要用作替代使用自定义委托。如果使用采用完成处理程序块的方法创建任务,则不会调用响应和数据传递的委托方法。

因此,如果使用完成处理程序方法,则NSURLSessionDataDelegate无效,但NSURLSessionDelegateNSURLSessionTaskDelegate可能会有效。

如果您对连接进行复杂处理,则委托方法最好,例如在完成或其他复杂处理之前使用数据作为流连接。您需要定义和创建一个对象来处理任务,跟踪状态以及收到数据后应该做些什么。您还需要保留此对象。单个对象可以处理多个连接,但这也是您需要处理的复杂性。

回调/闭包/块方法允许处理响应的所有逻辑和数据定义在请求所在的所有状态中,如果在闭包中需要它,则从请求捕获的时间开始。如果您的要求很简单,那么在我看来,这通常是最好的方法,因为将代码保持在一起并且不需要担心多个任务及其状态。