NSURLSession: загрузка ресурсов с фоновой передачей

Как лучше всего использовать фоновую передачу для загрузки ресурсов из галереи?

Похоже, что uploadTaskWithRequest:fromData: не работает с NSURLSession, созданным с помощью backgroundSessionConfiguration, поскольку это вызывает исключение: «Приложение завершает работу из-за необработанного исключения« NSGenericException », причина:« Задачи загрузки в фоновых сеансах должны быть из файла». Судя по описанию исключения, фоновая передача не должна работать и с задачами потоковой загрузки.

Справедливо. uploadTaskWithRequest:fromFile: — это первое, что приходит на ум, когда вы думаете о загрузке данных, которые у вас уже есть на диске. Но справочник класса NSURLSession говорит нам, что этот метод работает только с URL-адресами файлов, но когда вы получаете путь URL-адреса актива, он начинается с «assets-library://asset/...», и предоставление этого пути тоже не работает.

Таким образом, кажется, что единственный оставшийся вариант — скопировать файл из библиотеки ресурсов во временный каталог и указать URL-адрес файла для uploadTaskWithRequest:fromFile:. Но это не имеет никакого смысла, потому что у вас уже есть файл ресурсов, сохраненный на вашем диске. Я что-то пропустил?

Обновление:

Разговаривал с инженером Apple на мероприятии Tech Talks, и он подтвердил, что фоновая NSURLSession поддерживает только URL-адреса файлов. Так что действительно, вам нужно скопировать библиотеку активов во временный каталог и предоставить URL-адрес ее файла uploadTaskWithRequest:fromFile:, чтобы загрузить его с помощью фонового NSURLSession. Однако это поведение может измениться в будущем.


person Alexander Dvornikov    schedule 14.11.2013    source источник


Ответы (1)


Они также говорят где-то в документации, что URL-адреса для загрузки/выгрузки поддерживают только файловые схемы http https. Фон поддерживает только http/https.
Я считаю, что основные URL-адреса библиотеки данных и ресурсов, несмотря на то, что они технически действительны, на самом деле не являются URL-адресами и, скорее всего, не реализуются путем создания пользовательских NSurl-протоколов.

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

person Robert Geifman    schedule 18.11.2013
comment
Ну, да. Копирование файла - это в основном то, чем я сейчас занимаюсь. Как ваши успехи с nsursession? - person Alexander Dvornikov; 20.11.2013
comment
@RobertGeifman Так что в основном uploadTaskWithRequest:fromData: не работает? - person marciokoko; 05.08.2014
comment
@marciokoko, нет, это работает, но для обычного сеанса URL. Если вы хотите загружать в фоновом режиме, запишите свои данные в файл, а затем передайте URL-адрес этой плитки в фоновый сеанс. - person Robert Geifman; 21.08.2014