我有一个支持将内容下载到本地磁盘的应用程序。 用户可以选择要保存的项目。下载完成后,我将解压缩下载的文件并加密然后保存到本地。我使用 NSURLSession 和 backgroundConfiguration 来支持后台下载。我希望用户尽快访问下载的内容,因此我实现自己的队列来处理下载项目。我希望下载机制可以在前台和后台工作。以下是一些机制及其结果
首先创建每个下载任务,然后将对象排入队列
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 ....
在URLSession委托功能中创建下载任务,并直接恢复
当app已经进入后台时,此方法仅下载正在运行的下载任务。
任何人都可以通过先进先出属性向我提供有关背景的建议吗?
答案 0 :(得分:0)
如果不启动NSURLSessionTask对象,则无法启动它们。假设您创建对象,调整其设置,并立即启动它。因此,一旦创建对象IIRC,某些超时就会开始倒计时。因此,如果您创建对象然后在一两分钟后启动它,它将在它开始之前超时。很遗憾,我很确定在任何文档中都没有提到这个事实。
更好(阅读"可能工作")方法是存储NSURLRequest对象,并将其排入队列。然后,在适当的时候,将请求出列,创建一个任务,然后开始执行它。
此外,除非您将并发连接的数量限制为1,否则URL会话不会接近FIFO。否则,您将达到每个主机的最大并发请求数,并且它赢得了' t开始对该主机的任何更多请求,直到一个完成,但是其他主机的请求将立即开始。
答案 1 :(得分:0)
我认为你需要的是将httpMaximumConnectionsPerHost
对象设置为1.这意味着会话将在当时发出一个请求,因此当你调用它时它将是FIFO。甚至不需要在委托回调方法中存储和恢复下一个任务,它将全部自动发生。