我正在尝试更新旧应用程序以从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文件添加传输安全性权限,但这是关于它的)。但是,当我尝试在我的项目中使用此代码时,从不调用委托。当我实际上将我的代码粘贴到另一个简单的应用程序时,它工作正常。那么我的项目设置可能出错?你能否告诉我什么会导致这样的事情?我此刻完全不知所措。
答案 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