2016-01-26 33 views
1

我有一个支持将内容下载到本地磁盘的应用程序。 用户可以选择他们想要保存的项目。下载完成后,我将解压下载的文件并加密,然后保存到本地。我用NSURLSessionbackgroundConfiguration来支持后台下载。我希望用户尽快访问下载的内容,因此我实现了自己的队列来处理下载项目。我希望下载机制可以在前台和后台都能工作。这里有一些机制及其结果ios URLSession后台下载FIFO机制

  • 方法1:

首先创建每个下载任务,以及排队对象

downloadObj.downloadTask = [session downloadTaskWithRequest:request]; 

downloadObj.taskIdentifier = downloadObj.downloadTask.taskIdentifier; 

[Queue enqueue:downloadObj]; 

过程中头部对象在队列

obj = [Queue objectAtIndex:0]; 
[obj.downloadTask resume]; 

手柄下一个对象在URLSession委托功能

-(void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL { 

    finishObj = [Queue findObjFromIdentifier:downloadTask.taskIdentifier]; 

    nextObj = [Queue findNextObj:finishObj]; 

    [nextObj.downloadTask resume]; 

    [Queue removeObject:finishObj]; 

} 

这种方法可以正常工作,当应用程序总是在前台。当应用程序进入后台时,所有创建的downloadTasks似乎会自动恢复。 所以他们会同时分享带宽。 它不遵循先进先出 ....

  • 方法2:

创建URLSession委托功能下载任务,并直接恢复

这种方法仅下载当应用已经进入后台时运行的下载任务

任何人都可以给我讲述了背景先进先出产权一些建议?

+0

我们有同样的问题。你有没有找到解决方案? –

回答

0

如果不启动NSURLSessionTask对象,您无法保持它。假定您创建对象,调整其设置并立即启动它。因此,一旦创建对象IIRC,某些超时就开始倒计时。因此,如果您创建对象,然后在一两分钟后启动它,它甚至会在启动之前超时。不幸的是,我很确定这个事实在任何文档中都没有提及。

一个好得多的(读“可能工作”)方法是存储NSURLRequest对象,并将其排入队列。然后,在适当的时候,请求请求,创建一个任务并开始执行它。