我需要下载大量文件(大约500个)。我有一个包含这些文件的所有网址的数组,我想使用NSURLSession
,以便我也可以支持后台下载。
我无法想出实现这一目标的正确方法。如果我在一个文件完成后启动下一个文件下载,那么后台下载将无效。
我应该创建多个下载任务并启动吗?
请建议我如何实现这一目标。
答案 0 :(得分:0)
编辑: 首先,抱歉迟到的回复,这是一个解决您的问题的方法。首先下载Apple的Simple Background Transfer示例。然后,您将在视图控制器中看到URLSessionDidFinishEventsForBackgroundURLSession方法。你可以修改这个方法来调用另一个下载任务,如下面的示例,我认为这就是你想要做的。
对此方法也有评论,例如会话代理将收到此消息,表明之前已为此会话排队的所有消息都已发送。因此,为您的请求创建队列可能是更好的解决方案呢。
- (void)URLSessionDidFinishEventsForBackgroundURLSession:(NSURLSession *)session
{
APLAppDelegate *appDelegate = (APLAppDelegate *)[[UIApplication sharedApplication] delegate];
if (appDelegate.backgroundSessionCompletionHandler) {
void (^completionHandler)() = appDelegate.backgroundSessionCompletionHandler;
appDelegate.backgroundSessionCompletionHandler = nil;
completionHandler();
[self start:nil];
}
NSLog(@"All tasks are finished");
}
答案 1 :(得分:0)
我遇到了这个问题。我的应用程序必须更新自己并使用BACKGROUND FETCH在后台下载新闻视频以获取json文件列表,然后启动n个webservice调用以使用BACKGROUND TRANSFER下载这些文件
[NSURLSessionConfiguration backgroundSessionConfiguration:
对于每个文件,我创建了一个NSSession和一个NSURLSessionDownloadTask。
file 1 - NSSession1 > NSURLSessionDownloadTask1
file 2 - NSSession2 > NSURLSessionDownloadTask2
file 3 - NSSession3 > NSURLSessionDownloadTask3
当应用程序处于前台时,这会很好。
但当应用程序处于后台并被BACKGROUND FETCH唤醒时,我遇到了问题 一个文件将下载,然后它将停止。 这就像只有第一个NSSession1被执行了。 可能是iOS正在等待设备再次空闲以运行下一个会话但这太慢了
我通过拥有一个NSSession并附加所有NSURLSessionDownloadTask3来实现它的工作
NSURLSession * backgroundSession_ =
for(url to call){
create NSURLSessionDownloadTask1 (set its session:backgroundSession_)
create NSURLSessionDownloadTask2 (set its session:backgroundSession_)
create NSURLSessionDownloadTask3 (set its session:backgroundSession_)
}
这样做时要小心 调用NSSession finishTasksAndInvalidate not invalidateAndCancel
//[session invalidateAndCancel];
[session finishTasksAndInvalidate];
invalidateAndCancel将停止会话而不完成其他下载任务