2

我有以下实现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  

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

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

我确实在所有场景中都正确接收了 didReceiveData、didReceiveResponse 回调。虽然它需要在此处设置 HTTPs,但尚未检查 didReceiveChallenge 回调。

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

1)为什么didCompleteWithError网络宕机时收不到回调?

2)考虑到没有网络问题,didCompleteWithError任务成功完成时是否收到回调?如果没有,什么回调表示任务完成,比如connectionDidFinishLoading使用时NSURLConnection

我在启动任务时在请求参数中使用了缓存策略。是不是因为这个,没有调用didcompletewitherror,而是应该实现缓存委托?

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

谢谢

4

2 回答 2

0

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

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

于 2017-05-11T09:53:40.347 回答
0

delegateQueue :[NSOperationQueue mainQueue] 而不是 delegateQueue :nil 成功了。我仍然不确定如何。但是,是的,问题消失了。有人可以解释这是如何工作的吗?

于 2015-10-09T13:43:48.213 回答