我有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而不是缓存委托应该实现?
伙计们,请帮忙。我被卡住了。
三江源
答案 0 :(得分:0)
delegateQueue:[NSOperationQueue mainQueue] 而不是delegateQueue:nil做了伎俩。 我仍然不确定如何。但是,问题已经消失了。 任何人都能解释一下这是如何起作用的吗?
答案 1 :(得分:0)
你的循环“while(!finished)”是非常糟糕的做法。基本上下载任务是异步操作,但是在你的while循环中你阻塞线程并强制下载任务在该线程中完成。这可能会影响系统行为。
我相信删除此循环可以解决您的问题。