不调用 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 委托方法的主要内容,如果未能解决你的问题,请参考以下文章
出于开发目的,如何使用 iOS 7 的 NSURLSession 及其委托方法系列接受自签名 SSL 证书?
NSURLSession 委托跨类拆分 - NSURLSession、NSURLUploadTask、NSURLDownloadTask