我有以下实现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,而是应该实现缓存委托?
伙计们,请帮忙。我被困住了。
谢谢