不调用NSURLSession委托方法

时间:2017-04-26 13:51:16

标签: ios objective-c delegates nsurlsession

我正在尝试更新旧应用程序以从NSURLConnection迁移到NSURLSession。当我使用块来进行NSURLSession时,一切正常:

 NSURLSessionDataTask *dataTask = [session
                                          dataTaskWithRequest:request 
 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {}

但有时我需要分析应用程序从服务器接收的数据,因此我需要didReceiveResponse和didReceiveData方法,类似于NSURLConnection使用的方法。我试着这样做:

 NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

 NSURLSession *session = [NSURLSession sessionWithConfiguration:configuration
                                                      delegate:self
                                                 delegateQueue:nil];
 NSURLSessionDataTask *dataTask = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"]];
 [dataTask resume];

但我的代表们从未被召集过:

- (void)URLSession:(NSURLSession *)session
 NSURLSessionTaskDelegatedidReceiveResponse:(NSURLResponse *)response
 completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler
{
    NSLog(@"-----------------------> NSURLSessionTaskDelegatedidReceiveResponse");
    completionHandler(NSURLSessionResponseAllow);
}
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
    NSLog(@"----------------> didReceiveData");
}

当我尝试使用其他类型的任务(例如NSURLSessionDownloadTask)时,会发生同样的事情,从不调用它们的委托。我实际上可以在调试器中看到任务正在切换到运行状态,但我永远无法调用委托。 在我的头文件中,我确实将ViewController符合委托:

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDataDelegate, NSURLSessionTaskDelegate>

我做了很多搜索,但即使我在网上尝试一些工作示例,他们只要我尝试将它们粘贴到我的项目中就会停止工作。例如this tutorial对我来说非常适合(我必须向plist文件添加传输安全性权限,但这是关于它的)。但是,当我尝试在我的项目中使用此代码时,从不调用委托。当我实际上将我的代码粘贴到另一个简单的应用程序时,它工作正常。那么我的项目设置可能出错?你能否告诉我什么会导致这样的事情?我此刻完全不知所措。

1 个答案:

答案 0 :(得分:3)

您正在使用完成块。这排除了委托调用。 https://developer.apple.com/reference/foundation/nsurlsessiondatadelegate?language=objc

  

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

您要使用的方法与

具有不同的名称
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler