IOS 7 - Возобновляемые загрузки NSURLSession

В настоящее время я разрабатываю систему для загрузки нескольких изображений на сервер из приложения. Файлы будут сохранены на локальном устройстве, и текущая идея состоит в том, чтобы разделить их на куски, а затем загрузить их на сервер, ожидая сообщения об успешном завершении перед загрузкой следующего.

Этот процесс должен быть бесшовным для пользователя, он должен нажать кнопку, чтобы отправить все изображения, а затем закрыть приложение и продолжить его в фоновом режиме. С iOS 7 я видел, что вы можете передавать свои загрузки в новый API NSURLSession и иметь дело с задачей загрузки независимо от вашего приложения.

Мне было интересно, знает ли кто, насколько надежна эта передача. Если я передам ему весь образ, что произойдет, если интернет-соединение упадет наполовину? Повторяет ли служба переноса фона позднее? Идея заключается в том, что мы можем загрузить изображение, и если он не пройдет половину пути, мы можем просто продолжить с этой точки позже, когда соединение возобновится.

Одна из идей заключалась в том, чтобы разделить файлы на куски, а затем передать все куски в виде отдельных NSURLSessionUploadTasks и просто предположить, что все они будут отправлены на сервер в конце концов.

Другой должен был отправить первый фрагмент, используя:

uploadTaskWithRequest:fromData:completionHandler:

И затем в завершенииHandler, чтобы отправить следующий фрагмент. Моя проблема заключается в том, что если в фоновом режиме следующий фрагмент будет иметь

@property BOOL discretionary = true

что означает, что он будет отправлять только через Wi-Fi при подключении. Мне нужно, чтобы это работало во всех сетях и было в состоянии справиться с перебоями.

Мне не нужен код, просто совет, если это правильный способ добиться этого.

Ответ 1

Я постараюсь ответить на некоторые из ваших вопросов.

Если ваша загрузка останавливается на полпути из-за ошибки, ваше приложение должно быть запущено в фоновом режиме, и вы должны будете выполнить необходимую обработку ошибок. В вашем случае, если сервер поддерживает возобновляемые загрузки, вы сможете получить смещение, а затем настроить другую задачу для загрузки следующего фрагмента.

Если вы используете NSURLSession, настроенную для работы в фоновом режиме, вы не можете настраивать задачи загрузки с обработчиками завершения, и вы не можете загружать свои фрагменты с использованием объекта NSData. Ваш единственный вариант - записать куски на диск, а затем использовать

uploadTaskWithRequest:fromFile:

Я думаю, что это имеет смысл, потому что объект NSData находится в памяти приложения, а фоновые загрузки выполняются внешним демоном, поэтому было бы правильно загружать файлы (из песочницы пользователя). Кроме того, вместо использования обработчиков завершения вам нужно будет использовать делегаты для прослушивания обратных вызовов (в то время как приложение находится на переднем плане).

Если вы все еще предпочитаете использовать объект NSData, альтернативным решением будет создание задачи с использованием

downloadTaskWithRequest:

Таким образом вы можете установить объект NSData в теле запроса и передать его в запросе. Для этого вам нужно будет настроить ваш запрос, используя NSURLMutableRequest.

Для дискреционного свойства, поскольку оно по умолчанию имеет значение TRUE, я не уверен, можем ли мы сделать многое об этом. Он говорит, что передача происходит более вероятно на Wi-Fi и при подключении, поэтому может быть небольшая вероятность, что это может произойти по сотовой связи, но не верьте мне на слово. Я просто догадываюсь.