2017-04-26 155 views
0

我试图更新旧的应用程序以从NSURLConnection移动到NSURLSession。一切工作正常,当我用块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

你看到这一点:http://stackoverflow.com/questions/21200521/nsurlsession-delegate-methods-not-called ? – Koen

+0

不幸的是,我的问题与URL无关。我试图使用一些不同的东西,最初我通过[session dataTaskWithRequest:request]使用之前用过NSURLConnection的URL; (它当然是用https://)。 – Evgeny

回答

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 
+0

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