【发布时间】: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 文件,但仅此而已)。但是当我试图在我的项目中使用此代码时,代表永远不会被调用。当我实际上将我的代码粘贴到另一个简单的应用程序时,它工作得很好。所以我的项目设置可能有问题?你能告诉我什么会导致这样的事情吗?我现在完全不知所措。
【问题讨论】:
-
不幸的是,我的问题与 URL 无关。我尝试使用一些不同的 URL,最初我通过 [session dataTaskWithRequest:request] 使用之前与我的 NSURLConnection 一起使用的 URL; (当然是 https:// )。
标签: ios objective-c delegates nsurlsession