未调用NSURLSession委托didCompleteWithError

时间:2015-10-01 12:50:01

标签: ios objective-c nsurlconnection nsurlsession nsurlsessiondatatask

我有NSURLSession的以下实现。

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:configuration
                                                               delegate:self
                                                               delegateQueue: nil];

NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request];
[task resume];        
while(!finished) {
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]];
}  

我实现了以下代理方法:

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data  
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse  
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didCompleteWithError:(NSError *)error  
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge 
  completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition,
                         NSURLCredential *credential))completionHandler  

当收到didCompleteWithError委托时,上面的while循环的“finished”变量设置为1表示存在网络故障等问题...

当网络关闭时,我没有得到didCompleteWithErrorcallback,因此即使指定了10秒超时并且我的应用程序崩溃,提供内存警告,while循环也不会退出。

我正确地接收了didReceiveData,didReceiveResponse回调所有的风格。但是没有检查didReceiveChallenge回调,因为它需要在这里设置HTTPs。

所以,如果你能帮助我,我有以下问题要问:

1)为什么在网络关闭时没有收到didCompleteWithError回叫?

2)考虑到没有网络问题,成功完成任务后收到didCompleteWithError回调吗?如果不是,回调将表示任务完成,例如connectionDidFinishLoading使用NSURLConnection时?

我在启动任务时在request参数中使用了cachepolicy。是因为这个didcompletewitherror没有被称为n而不是缓存委托应该实现?

伙计们,请帮忙。我被卡住了。

三江源

2 个答案:

答案 0 :(得分:0)

delegateQueue:[NSOperationQueue mainQueue] 而不是delegateQueue:nil做了伎俩。 我仍然不确定如何。但是,问题已经消失了。 任何人都能解释一下这是如何起作用的吗?

答案 1 :(得分:0)

你的循环“while(!finished)”是非常糟糕的做法。基本上下载任务是异步操作,但是在你的while循环中你阻塞线程并强制下载任务在该线程中完成。这可能会影响系统行为。

我相信删除此循环可以解决您的问题。

相关问题