ios - NSURLSession 下载任务在成功后失败

标签 ios nsurlsession

我的 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:] 中得到两次(而不是预期的一次)调用。一旦没有错误(这与对 -[NSURLSessionDownloadDelegate URLSession:downloadTask:didFinishDownloadingToURL:] 的 200 OK 响应代码的调用对齐)然后另一次,通常是几秒钟后 错误 (-997)。两次它都是传递给这些委托(delegate)方法的任务的完全相同的内存地址。

有没有人遇到过类似的事情?在我被告知我的任务成功后,我并不期待第二次回调。为什么 NSURLSession 可能仍然坚持它据称已经完成的任务,但突然间认为它应该通知我它失去了与后台传输服务的连接,这有什么明显的原因吗?

最佳答案

FWIW,我有一个类似的问题,因为我正在从在后台线程中运行的 NSURLSession 委托(delegate)方法更新 UI。

所以,我的解决方案是将与 UI 相关的代码移动到主线程上运行,如下所示:

dispatch_async(dispatch_get_main_queue(), ^{
      //code updating the UI.
});

关于ios - NSURLSession 下载任务在成功后失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28856483/

相关文章:

ios - 无法下载 gzip 文件的 bin 文件

ios - 您的二进制文件中不存在应用内购买功能

ios - 更新的 ios5 应用程序 xcode 不会在 __dyld__dyld_start 运行停止

ios - 如何配置 NSURLSession 请求在连接断开时的重试次数?

ios - NSURLSession sharedSession 默认超时

ios - 如何从 NSURLSession 中停止任务或部分

ios - 苹果拒绝了应用程序,因为我强制用户更新他们的应用程序版本

ios - 带有 block 的 Objective-C 延迟 Action

ios - 如何使用 if/else 条件来切换手电筒?

ios - NSURLSession 不返回数据