2013-11-22 50 views
2

我有要求下载一些文件(500左右)。我有一个包含这些文件的所有url的数组,我想使用NSURLSession,这样我也可以支持后台下载。NSurlSession - 下载许多文件

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

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

请建议我如何做到这一点。

+0

您可以为此使用队列。实现您自己的数据管理器,并相应地委托属性,并在功能上实现队列。另外我觉得'NSURLConnection'确实已经实现了这个。所以,你可以忘记所有的连接,并直接要求'NSURLConnection'来领导所有的文件。 –

+0

有没有令人信服的理由使用NSURLConnection?或者你可以使用NSURLSession(> = iOS 7)? – CouchDeveloper

+0

对不起,我正在谈论NSURLSession(现在编辑)。它支持后台下载,但直接下载一个大文件,但我的问题是关于下载一些中小型文件。 – Amit

回答

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"); 
} 
+0

如果您有下载500个文件的要求,这是否自动暗示此操作必须是可取消的并且可恢复? – CouchDeveloper

+0

如果我有这样的要求,是的,它必须是可以取消的,但他没有提到任何关于它的任何事情。它可以是一个学校项目,或者他可以做一些基准测试。如果他将更具体的需求更新他的问题,我可以很乐意编辑我的答案。 – BoranA

+0

请参阅编辑,我错误地提出问题的道歉。恢复和取消将成为要求的一部分,但目前我只是在寻找下载解决方案。 – Amit

0

我遇到了这个问题。我的应用程序必须进行自我更新和下载新闻视频在后台使用背景FETCH获取文件的JSON名单,然后烧制关n已Web服务调用数使用后台传输

[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不invalidateAndCancel

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

invalidateAndCancel将停止会话并没有完成其他下载任务