NSurlSession - 下载许多文件

时间:2013-11-22 12:22:15

标签: ios ios7 nsurlsession

我需要下载大量文件(大约500个)。我有一个包含这些文件的所有网址的数组,我想使用NSURLSession,以便我也可以支持后台下载。

我无法想出实现这一目标的正确方法。如果我在一个文件完成后启动下一个文件下载,那么后台下载将无效。

我应该创建多个下载任务并启动吗?

请建议我如何实现这一目标。

2 个答案:

答案 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将停止会话而不完成其他下载任务