从我的NSURLSessionDownloadTasks(使用后台下载配置)开始,我遇到了一个奇怪的问题。
它始终与NSURLDomain代码NSURLErrorBackgroundSessionWasDisconnected(-997)的错误有关。错误本身通常似乎来自于从Xcode开发过程中一般崩溃或强制关闭的应用程序。
相关代码归结为
- (void)download:(NSURLRequest *)request
{
NSURLSessionDownloadTask *downloadTask = [self.urlSession downloadTaskWithRequest:request];
[downloadTask resume];
}
- (void) URLSession:(NSURLSession *)session
downloadTask:(NSURLSessionDownloadTask *)downloadTask
didFinishDownloadingToURL:(NSURL *)tempLocation
{
NSLog(@"task %@ didFinishDownloadingToURL with status code %@", downloadTask, @([downloadTask.response statusCode]));
}
- (void) URLSession:(NSURLSession *)session
task:(NSURLSessionTask *)task
didCompleteWithError:(NSError *)error
{
NSLog(@"task %@ didCompleteWithError %@", task, error);
}
在这些情况下的问题是,相同的NSURLSessionDownloadTask在-[NSURLSessionTaskDelegate URLSession:task:didCompleteWithError:]
中获得两个(而不是仅一个预期的)调用。一旦没有错误(与200 {200}响应代码的调用对齐-[NSURLSessionDownloadDelegate URLSession:downloadTask:didFinishDownloadingToURL:]
),然后是另一次,通常是几秒钟后 错误(-997)。两次它与传递给这些委托方法的任务的内存地址完全相同。
还有其他人经历过类似的事吗?在我被告知我的任务成功之后,我不期待第二次回调。有没有明显的理由说明为什么NSURLSession仍然可以继续执行它已经完成的任务但是突然之间认为应该告诉我它已经失去了与后台传输服务的连接?
答案 0 :(得分:0)
FWIW,我遇到了类似的问题,因为我正在从NSURLSession委托方法更新UI,后者在后台线程中运行。
所以,我的解决方案是将与UI相关的代码移动到主线程上,如下所示:
dispatch_async(dispatch_get_main_queue(), ^{
//code updating the UI.
});