ios URLSession后台下载FIFO机制

时间:2016-01-26 10:01:58

标签: ios background nsurlsession

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

  • 方法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];

}

当app始终在前台时,此方法可以正常工作。当应用程序进入后台时,所有创建的downloadTasks似乎都会自动恢复。 因此他们将同时共享带宽。 它不跟踪FIFO ....

  • 方法2:

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

当app已经进入后台时,此方法仅下载正在运行的下载任务

任何人都可以通过先进先出属性向我提供有关背景的建议吗?

2 个答案:

答案 0 :(得分:0)

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

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

此外,除非您将并发连接的数量限制为1,否则URL会话不会接近FIFO。否则,您将达到每个主机的最大并发请求数,并且它赢得了' t开始对该主机的任何更多请求,直到一个完成,但是其他主机的请求将立即开始。

答案 1 :(得分:0)

我认为你需要的是将httpMaximumConnectionsPerHost对象设置为1.这意味着会话将在当时发出一个请求,因此当你调用它时它将是FIFO。甚至不需要在委托回调方法中存储和恢复下一个任务,它将全部自动发生。