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 数据任务完成处理程序