Жизненный цикл сеанса URL

Можно использовать NSURLSession API двумя способами: с предоставленным системой делегатом или с Вашим собственным делегатом. В целом, если приложение делает какое-либо следующее, необходимо использовать собственного делегата:

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

Жизненный цикл сеанса URL с предоставленными системой делегатами

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

  1. Создайте конфигурацию сеанса. Для фоновых сеансов эта конфигурация должна содержать уникальный идентификатор. Сохраните тот идентификатор и используйте его, чтобы повторно связаться с сеансом, если Ваши сбои приложения или завершены или приостановлены.

  2. Создайте сеанс, указав объект конфигурации и a nil делегат.

  3. Создайте объекты задачи в сеансе, что каждый представляет запрос ресурса.

    Каждая задача начинается в состоянии ожидания. После Ваших вызовов приложения resume на задаче это начинает загружать указанный ресурс.

    Объекты задачи являются подклассами NSURLSessionTaskNSURLSessionDataTask, NSURLSessionUploadTask, или NSURLSessionDownloadTask, В зависимости от поведения Вы пытаетесь достигнуть. Эти объекты походят NSURLConnection объекты, но дают Вам больше контроля и объединенную модель делегата.

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

  4. Для задачи загрузки, во время передачи от сервера, если пользователь говорит Вашему приложению приостанавливать загрузку, отменяют задачу путем вызова cancelByProducingResumeData: метод. Позже, передайте возвращенные данные резюме любому downloadTaskWithResumeData: или downloadTaskWithResumeData:completionHandler: метод для создания новой задачи загрузки, продолжающей загрузку.

  5. Когда задача завершается, NSURLSession вызовы объектов обработчик завершения задачи.

  6. Когда для Вашего приложения больше не будет нужен сеанс, лишите законной силы его путем вызова также invalidateAndCancel (для отмены выдающихся задач) или finishTasksAndInvalidate (чтобы позволить выдающимся задачам закончиться прежде, чем лишить законной силы объект).

Жизненный цикл сеанса URL с пользовательскими делегатами

Можно часто использовать NSURLSession API, не предоставляя делегату. Однако, если Вы используете NSURLSession API для фоновых загрузок и загрузок, или если необходимо обработать аутентификацию или кэширующийся способом не по умолчанию, необходимо предоставить делегату, приспосабливающему делегату сеанса протоколу, один или несколько делегатов задачи протоколы или некоторая комбинация этих протоколов. Этот делегат служит многим целям:

При использовании пользовательских делегатов с сеансом URL (требуемый для фоновых задач), полный жизненный цикл сеанса URL более сложен. Вот основная последовательность вызовов метода, что Ваше приложение должно сделать и делегировать вызовы, при использовании которых получает Ваше приложение NSURLSession с пользовательским делегатом:

  1. Создайте конфигурацию сеанса. Для фоновых сеансов эта конфигурация должна содержать уникальный идентификатор. Сохраните тот идентификатор и используйте его, чтобы повторно связаться с сеансом, если Ваши сбои приложения или завершены или приостановлены.

  2. Создайте сеанс, указав объект конфигурации и, дополнительно, делегат.

  3. Создайте объекты задачи в сеансе, что каждый представляет запрос ресурса.

    Каждая задача начинается в состоянии ожидания. После Ваших вызовов приложения resume на задаче это начинает загружать указанный ресурс.

    Объекты задачи являются подклассами NSURLSessionTaskNSURLSessionDataTask, NSURLSessionUploadTask, или NSURLSessionDownloadTask, В зависимости от поведения Вы пытаетесь достигнуть. Эти объекты походят NSURLConnection объекты, но дают Вам больше контроля и объединенную модель делегата.

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

  4. Если удаленный сервер возвращает код состояния, указывающий, что аутентификация требуется и если та аутентификация требует проблемы уровня соединения (такой как клиентский сертификат SSL), NSURLSession вызывает метод делегата запроса аутентификации.

    Если данные задачи предоставлены от потока, если аутентификация перестала работать для задачи загрузки NSURLSession вызовы объектов делегат URLSession:task:needNewBodyStream: метод делегата. Делегат должен тогда обеспечить новое NSInputStream объект предоставить данные организации для нового запроса.

    Для получения дополнительной информации о записи метода делегата аутентификации для NSURLSession, считайте Запросы аутентификации и Проверку Цепочки TLS.

  5. После получения HTTP перенаправляют ответ, NSURLSession вызовы объектов делегат URLSession:task:willPerformHTTPRedirection:newRequest:completionHandler: метод. Тот метод делегата вызывает предоставленный обработчик завершения с любым предоставленное NSURLRequest объект (для следования за перенаправлением), новое NSURLRequest объект (для перенаправления к различному URL), или nil (чтобы обработать организацию ответа перенаправления как допустимый ответ и возвратить его как результат).

    • Если перенаправление сопровождается, вернитесь к шагу 4 (обработка запроса аутентификации).

    • Если делегат не реализует этот метод, перенаправление сопровождается до максимального количества перенаправлений.

  6. Для (пере-) загружают задачу, создаваемую путем вызова downloadTaskWithResumeData: или downloadTaskWithResumeData:completionHandler:, NSURLSession вызывает делегата URLSession:downloadTask:didResumeAtOffset:expectedTotalBytes: метод с новым объектом задачи.

  7. Для задачи данных, NSURLSession вызовы объектов делегат URLSession:dataTask:didReceiveResponse:completionHandler: метод. Решите, преобразовать ли задачу данных в задачу загрузки, и затем вызвать обратный вызов завершения, чтобы продолжать получать данные или загружать данные.

    Если Ваше приложение принимает решение преобразовать задачу данных в задачу загрузки, NSURLSession вызывает делегата URLSession:dataTask:didBecomeDownloadTask: метод с новой задачей загрузки в качестве параметра. После этого вызова делегат не получает дальнейших обратных вызовов от задачи данных и начинает получать обратные вызовы от задачи загрузки.

  8. Если задача создавалась с uploadTaskWithStreamedRequest:, NSURLSession вызывает делегата URLSession:task:needNewBodyStream: метод для предоставления данных организации.

  9. Во время начальной загрузки содержания организации к серверу (если применимо), делегат периодически получает URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend: обратные вызовы, сообщающие о прогрессе загрузки.

  10. Во время передачи от сервера делегат задачи периодически получает обратный вызов для создания отчетов о прогрессе передачи. Для задачи загрузки сеанс вызывает делегата URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite: метод с числом байтов, успешно записанных в диск. Для задачи данных сеанс вызывает делегата URLSession:dataTask:didReceiveData: метод с фактическими частями данных, поскольку они получены.

    Для задачи загрузки, во время передачи от сервера, если пользователь говорит Вашему приложению приостанавливать загрузку, отменяют задачу путем вызова cancelByProducingResumeData: метод.

    Позже, если пользователь просит, чтобы Ваше приложение возобновило загрузку, передайте возвращенные данные резюме любому downloadTaskWithResumeData: или downloadTaskWithResumeData:completionHandler: метод для создания новой задачи загрузки, продолжающей загрузку, затем перейдите к шагу 3 (создающие и возобновляющиеся объекты задачи).

  11. Для задачи данных, NSURLSession вызовы объектов делегат URLSession:dataTask:willCacheResponse:completionHandler: метод. Ваше приложение должно тогда решить, позволить ли кэшироваться. Если Вы не реализуете этот метод, поведение по умолчанию состоит в том, чтобы использовать кэширующуюся политику, указанную в объекте конфигурации сеанса.

  12. Если задача загрузки завершается успешно, то NSURLSession вызовы объектов задача URLSession:downloadTask:didFinishDownloadingToURL: метод с расположением временного файла. Ваше приложение должно или считать данные ответа из этого файла или переместить его в постоянное расположение в каталоге контейнера песочницы Вашего приложения перед этим методом делегата возвраты.

  13. Когда любая задача завершается, NSURLSession вызовы объектов делегат URLSession:task:didCompleteWithError: метод или с ошибкой возражает или с nil (если задача завершилась успешно).

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

    Если задача загрузки может быть возобновлена, NSError объект userInfo словарь содержит значение для NSURLSessionDownloadTaskResumeData ключ. Ваше приложение должно передать это значение для вызова downloadTaskWithResumeData: или downloadTaskWithResumeData:completionHandler: создать новую задачу загрузки, продолжающую существующую загрузку.

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

    В любом случае, если передача, отказавшая по какой-либо причине кроме ошибки сервера, переходят к шагу 3 (создающие и возобновляющиеся объекты задачи).

  14. Если ответ многослойный закодированный, сеанс может вызвать делегата didReceiveResponse метод снова, сопровождаемый нулем или более дополнительный didReceiveData вызовы. Если это происходит, перейдите к шагу 7 (обрабатывающий didReceiveResponse вызовите).

  15. Когда Вы больше не нуждаетесь в сеансе, лишаете законной силы его путем вызова также invalidateAndCancel (для отмены выдающихся задач) или finishTasksAndInvalidate (чтобы позволить выдающимся задачам закончиться прежде, чем лишить законной силы объект).

    После лишения законной силы сеанса, когда все выдающиеся задачи были отменены или закончились, сеанс отправляет делегата a URLSession:didBecomeInvalidWithError: сообщение. Когда тот метод делегата возвращается, сеанс избавляется от своей сильной ссылки делегату.

Если Ваше приложение отменяет происходящую загрузку, NSURLSession вызовы объектов делегат URLSession:task:didCompleteWithError: метод, как будто произошла ошибка.