2016-01-26 3 views
1

У меня есть приложение, которое будет поддерживать загрузку содержимого на локальный диск. Пользователи могут выбирать элементы, которые они хотят сохранить. После завершения загрузки я распакую загруженный файл и зашифрую его, а затем сохраните на локальном компьютере. Я использую NSURLSession с backgroundConfiguration для поддержки загрузки фона. Я хочу, чтобы пользователь получал доступ к загруженному контенту ASAP, поэтому я реализую свою собственную очередь для обработки элементов загрузки. Я хочу, чтобы механизм загрузки мог работать как на переднем плане, так и на заднем плане. Вот некоторые механизмы и их результатios URLSession background загрузить FIFO механизм

  • Метод 1:

Создать каждую задачу загрузки первой и епдиеего объект

downloadObj.downloadTask = [session downloadTaskWithRequest:request]; 

downloadObj.taskIdentifier = downloadObj.downloadTask.taskIdentifier; 

[Queue enqueue:downloadObj]; 

процесса объект головы в очереди

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

Handle следующий объект в функции делегата 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, похоже, возобновляются автоматически. Таким образом, они будут совместно использовать пропускную способность одновременно. Это не следует FIFO ....

  • Метод 2:

Создание задачи загрузки в функции делегата URLSession и резюме непосредственно

Этот метод только скачать текущее задание загрузки, когда приложение уже ввело фон.

Любой человек может дать мне некоторые рекомендации о фоне с First In First Out собственности?

+0

У нас та же проблема. Вы нашли решение? –

ответ

0

Вы не можете поддерживать объекты NSURLSessionTask таким образом, чтобы они не запускались. Предполагается, что вы создаете объект, настраиваете его настройки и начинаете его немедленно. В результате определенные таймауты начинают отсчет, как только вы создаете объект, IIRC. Поэтому, если вы создадите объект, а затем запустите его через минуту или две позже, он будет тайм-аут, прежде чем он даже начнет. Я уверен, что этот факт не упоминается ни в одной документации, к сожалению.

Практически лучше (читать «вероятно, работать») подход заключается в том, чтобы сохранить объект NSURLRequest и поставить в очередь. Затем, в соответствующее время, удалите запрос, создайте задачу и начните ее выполнение.