不调用 NSURLSession 委托方法

Posted

技术标签:

【中文标题】不调用 NSURLSession 委托方法【英文标题】:NSURLSession delegate methods are not called 【发布时间】:2017-04-26 13:51:16 【问题描述】:

我正在尝试更新旧应用程序以从 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 文件,但仅此而已)。但是当我试图在我的项目中使用此代码时,代表永远不会被调用。当我实际上将我的代码粘贴到另一个简单的应用程序时,它工作得很好。所以我的项目设置可能有问题?你能告诉我什么会导致这样的事情吗?我现在完全不知所措。

【问题讨论】:

你看到了吗:***.com/questions/21200521/…? 不幸的是,我的问题与 URL 无关。我尝试使用一些不同的 URL,最初我通过 [session dataTaskWithRequest:request] 使用之前与我的 NSURLConnection 一起使用的 URL; (当然是 https:// )。 【参考方案1】:

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

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

而且你要使用的方法有不同的名字

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

【讨论】:

是的,我使用块,但它们用于应用程序中的其他 NSURLSession 实例。我在我的测试项目中为不同的 NSURLSession 实例混合了一个块和一个委托,它们没有任何问题。感谢您的语法更正,我在为网络准备代码时可能搞砸了。

以上是关于不调用 NSURLSession 委托方法的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSession:后台崩溃,因为没有调用上传委托

URLSession 下载任务委托仅在所有任务完成后调用

出于开发目的,如何使用 iOS 7 的 NSURLSession 及其委托方法系列接受自签名 SSL 证书?

尝试使用 NSURLSession 加载网页

NSURLSession 委托跨类拆分 - NSURLSession、NSURLUploadTask、NSURLDownloadTask

NSURLSession - 数据为零