URLSession 下载任务委托仅在所有任务完成后调用

Posted

技术标签:

【中文标题】URLSession 下载任务委托仅在所有任务完成后调用【英文标题】:URLSession Download Task delegate only called after all tasks finish 【发布时间】:2014-11-08 20:25:28 【问题描述】:

我有一个NSURLSession,其后台配置同时下载两个或三个文件。除了委托方法之外,一切似乎都运行良好

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask 
didFinishDownloadingToURL:(NSURL *)location

-(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task 
didCompleteWithError:(NSError *)error

仅在所有下载任务完成时调用,而不是在每个下载任务完成时单独调用。其他用于单独更新下载进度功能的委托方法。

当我将NSURLSessionConfiguration 设置为defaultConfiguration 时也不会出现此问题,但是后台下载显然无法正常工作。我错过了什么吗?我应该为每个下载任务设置单独的NSURLSessions 吗?

编辑:根据要求,这里是创建会话和配置的代码。我已经包含了默认配置和后台会话配置,尽管在创建时只使用了一个。

  if (!_backgroundURLSession) 
    NSString *sessionID = [NSString stringWithFormat:@"%@.BackgroundSession", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIdentifier"]];


    NSURLSessionConfiguration *sessionConfig = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:sessionID];
    NSURLSessionConfiguration *defaultConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
    _backgroundURLSession = [NSURLSession sessionWithConfiguration:sessionConfig delegate:self delegateQueue:nil];
  

对于开始任何下载,[_backgroundURLSession downloadTaskWithURL:[NSURL URLWithString:_url]] 用于创建一个NSURLSessionDownloadTask,下载任务存储在一个NSMutableDictionary 中,以 URL 为键。当任务完成时,下载任务将从委托方法中的字典中删除。字典主要用于跟踪进度和取消任务。

【问题讨论】:

【参考方案1】:

似乎这种行为是 ios 模拟器特有的,以及 NSURLSession 中的一些其他奇怪行为。当我在设备上运行代码时,一切正常。

【讨论】:

以上是关于URLSession 下载任务委托仅在所有任务完成后调用的主要内容,如果未能解决你的问题,请参考以下文章

NSURLSessionDownloadTask 在后台自动恢复所有任务

我需要将 urlsession 数据任务放在另一个 DispatchQueue 上还是自动完成?

Swift 3,未调用 URLSession 数据任务完成处理程序

Swift URLSession DataTask 在应用程序进入后台时失败

未调用 URLSession 委托成功方法,但没有错误

如何将任务委托给主线程并等待其执行完成?