3

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

我想不出正确的方法来实现这一点。如果我在一个文件完成后开始下一个文件下载,那么后台下载将不起作用。

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

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

4

2 回答 2

0

我遇到了这个问题。我的应用程序必须更新自身并使用背景获取在后台下载新闻视频以获取文件的 json 列表,然后触发 n 个网络服务调用以使用背景传输下载这些文件

[NSURLSessionConfiguration 背景会话配置:

对于每个文件,我创建了一个 NSSession 和一个 NSURLSessionDownloadTask。

file 1 - NSSession1 > NSURLSessionDownloadTask1
file 2 - NSSession2 > NSURLSessionDownloadTask2
file 3 - NSSession3 > NSURLSessionDownloadTask3

当应用程序在前台时,这很好。

但是当应用程序处于后台并被背景提取唤醒时,我遇到了问题,一个文件会下载然后它会停止。就像只执行了第一个 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 而不是 invalidateAndCancel

  //[session invalidateAndCancel];
   [session finishTasksAndInvalidate];

invalidateAndCancel 将停止会话并且不完成其他下载任务

于 2014-08-21T15:13:40.803 回答
0

编辑:首先,很抱歉回复晚了,这是解决您问题的方法。首先下载 Apple 的简单后台传输示例。然后您将在视图控制器中看到 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");
}
于 2013-11-22T12:33:47.857 回答