Жизненный цикл сеанса URL
Можно использовать NSURLSession
API двумя способами: с предоставленным системой делегатом или с Вашим собственным делегатом. В целом, если приложение делает какое-либо следующее, необходимо использовать собственного делегата:
Фоновые сеансы использования, чтобы загрузить или загрузить содержание, в то время как не работает Ваше приложение.
Выполняет пользовательскую аутентификацию.
Выполняет пользовательскую проверку сертификата SSL.
Решает, должна ли передача быть загружена на диск или выведена на экран на основе типа MIME, возвращенного сервером или другими подобными критериями.
Данные загрузок от потока организации (в противоположность
NSData
объект).Пределы, кэширующиеся программно.
Пределы HTTP перенаправляют программно.
Если Ваше приложение не должно делать ни одной из этих вещей, Ваше приложение может использовать предоставленных системой делегатов. В зависимости от которого метода Вы выбираете, необходимо считать один из следующих разделов:
Жизненный цикл Сеанса URL с Предоставленными системой Делегатами обеспечивает легкое представление того, как Ваш код создает и использует сеанс URL. Необходимо считать этот раздел, даже если Вы намереваетесь записать Вашему собственному делегату, потому что он дает Вам полное изображение того, что Ваш код должен сделать, чтобы сконфигурировать объект и использовать его.
Жизненный цикл Сеанса URL с Пользовательскими Делегатами обеспечивает полное представление о каждом шаге в работе сеанса URL. Необходимо обратиться к этому разделу, чтобы помочь Вам понять, как сеанс взаимодействует со своим делегатом. В частности это объясняет, когда вызывают каждый из методов делегата.
Жизненный цикл сеанса URL с предоставленными системой делегатами
Если Вы используете NSURLSession
класс, не обеспечивая объект делегата, предоставленный системой делегат обрабатывает многие подробные данные для Вас. Вот основная последовательность вызовов метода, которые Ваше приложение должно сделать и вызовы обработчика завершения, при использовании которых получает Ваше приложение NSURLSession
с предоставленным системой делегатом:
Создайте конфигурацию сеанса. Для фоновых сеансов эта конфигурация должна содержать уникальный идентификатор. Сохраните тот идентификатор и используйте его, чтобы повторно связаться с сеансом, если Ваши сбои приложения или завершены или приостановлены.
Создайте сеанс, указав объект конфигурации и a
nil
делегат.Создайте объекты задачи в сеансе, что каждый представляет запрос ресурса.
Каждая задача начинается в состоянии ожидания. После Ваших вызовов приложения
resume
на задаче это начинает загружать указанный ресурс.Объекты задачи являются подклассами
NSURLSessionTask
—NSURLSessionDataTask
,NSURLSessionUploadTask
, илиNSURLSessionDownloadTask
, В зависимости от поведения Вы пытаетесь достигнуть. Эти объекты походятNSURLConnection
объекты, но дают Вам больше контроля и объединенную модель делегата.Несмотря на то, что Ваше приложение может (и обычно должен) добавлять больше чем одну задачу к сеансу, для простоты, остающиеся шаги описывают жизненный цикл с точки зрения единственной задачи.
Для задачи загрузки, во время передачи от сервера, если пользователь говорит Вашему приложению приостанавливать загрузку, отменяют задачу путем вызова
cancelByProducingResumeData:
метод. Позже, передайте возвращенные данные резюме любомуdownloadTaskWithResumeData:
илиdownloadTaskWithResumeData:completionHandler:
метод для создания новой задачи загрузки, продолжающей загрузку.Когда задача завершается,
NSURLSession
вызовы объектов обработчик завершения задачи.Когда для Вашего приложения больше не будет нужен сеанс, лишите законной силы его путем вызова также
invalidateAndCancel
(для отмены выдающихся задач) илиfinishTasksAndInvalidate
(чтобы позволить выдающимся задачам закончиться прежде, чем лишить законной силы объект).
Жизненный цикл сеанса URL с пользовательскими делегатами
Можно часто использовать NSURLSession
API, не предоставляя делегату. Однако, если Вы используете NSURLSession
API для фоновых загрузок и загрузок, или если необходимо обработать аутентификацию или кэширующийся способом не по умолчанию, необходимо предоставить делегату, приспосабливающему делегату сеанса протоколу, один или несколько делегатов задачи протоколы или некоторая комбинация этих протоколов. Этот делегат служит многим целям:
Когда используется с задачами загрузки,
NSURLSession
возразите использует делегата для обеспечения приложения файлом URL, где оно может получить загруженные данные.Делегаты требуются для всех фоновых загрузок и загрузок. Эти делегаты должны обеспечить все методы делегата в
NSURLSessionDownloadDelegate
протокол.Делегаты могут обработать определенные запросы аутентификации.
Делегаты обеспечивают потоки организации для загрузки данных на основе потоков к удаленному серверу.
Делегаты могут решить, следовать ли за перенаправлениями HTTP или нет.
NSURLSession
возразите использует делегата для обеспечения приложения состоянием каждой передачи. Делегаты задачи данных принимают и начальный вызов, в котором можно преобразовать запрос в загрузку и последующие вызовы, обеспечивающие части данных, когда они поступают от удаленного сервера.Делегаты являются одним путем в который
NSURLSession
когда передача завершена, объект может сказать Ваше приложение.
При использовании пользовательских делегатов с сеансом URL (требуемый для фоновых задач), полный жизненный цикл сеанса URL более сложен. Вот основная последовательность вызовов метода, что Ваше приложение должно сделать и делегировать вызовы, при использовании которых получает Ваше приложение NSURLSession
с пользовательским делегатом:
Создайте конфигурацию сеанса. Для фоновых сеансов эта конфигурация должна содержать уникальный идентификатор. Сохраните тот идентификатор и используйте его, чтобы повторно связаться с сеансом, если Ваши сбои приложения или завершены или приостановлены.
Создайте сеанс, указав объект конфигурации и, дополнительно, делегат.
Создайте объекты задачи в сеансе, что каждый представляет запрос ресурса.
Каждая задача начинается в состоянии ожидания. После Ваших вызовов приложения
resume
на задаче это начинает загружать указанный ресурс.Объекты задачи являются подклассами
NSURLSessionTask
—NSURLSessionDataTask
,NSURLSessionUploadTask
, илиNSURLSessionDownloadTask
, В зависимости от поведения Вы пытаетесь достигнуть. Эти объекты походятNSURLConnection
объекты, но дают Вам больше контроля и объединенную модель делегата.Несмотря на то, что Ваше приложение может (и обычно должен) добавлять больше чем одну задачу к сеансу, для простоты, остающиеся шаги описывают жизненный цикл с точки зрения единственной задачи.
Если удаленный сервер возвращает код состояния, указывающий, что аутентификация требуется и если та аутентификация требует проблемы уровня соединения (такой как клиентский сертификат SSL),
NSURLSession
вызывает метод делегата запроса аутентификации.Для проблем сеансового уровня —
NSURLAuthenticationMethodNTLM
,NSURLAuthenticationMethodNegotiate
,NSURLAuthenticationMethodClientCertificate
, илиNSURLAuthenticationMethodServerTrust
—NSURLSession
вызовы объектов делегат сеансаURLSession:didReceiveChallenge:completionHandler:
метод. Если Ваше приложение не обеспечивает метод делегата сеанса,NSURLSession
вызовы объектов делегат задачиURLSession:task:didReceiveChallenge:completionHandler:
метод для обработки проблемы.Для проблем несеансового уровня (все другие),
NSURLSession
вызовы объектов делегат сеансаURLSession:task:didReceiveChallenge:completionHandler:
метод для обработки проблемы. Если Ваше приложение предоставляет делегату сеанса, и необходимо обработать аутентификацию, то необходимо или обработать аутентификацию на уровне задачи или обеспечить обработчик уровня задачи, вызывающий обработчик на сеанс явно. Делегат сеансаURLSession:didReceiveChallenge:completionHandler:
метод не вызывают для проблем несеансового уровня.
Если данные задачи предоставлены от потока, если аутентификация перестала работать для задачи загрузки
NSURLSession
вызовы объектов делегатURLSession:task:needNewBodyStream:
метод делегата. Делегат должен тогда обеспечить новоеNSInputStream
объект предоставить данные организации для нового запроса.Для получения дополнительной информации о записи метода делегата аутентификации для
NSURLSession
, считайте Запросы аутентификации и Проверку Цепочки TLS.После получения HTTP перенаправляют ответ,
NSURLSession
вызовы объектов делегатURLSession:task:willPerformHTTPRedirection:newRequest:completionHandler:
метод. Тот метод делегата вызывает предоставленный обработчик завершения с любым предоставленноеNSURLRequest
объект (для следования за перенаправлением), новоеNSURLRequest
объект (для перенаправления к различному URL), илиnil
(чтобы обработать организацию ответа перенаправления как допустимый ответ и возвратить его как результат).Если перенаправление сопровождается, вернитесь к шагу 4 (обработка запроса аутентификации).
Если делегат не реализует этот метод, перенаправление сопровождается до максимального количества перенаправлений.
Для (пере-) загружают задачу, создаваемую путем вызова
downloadTaskWithResumeData:
илиdownloadTaskWithResumeData:completionHandler:
,NSURLSession
вызывает делегатаURLSession:downloadTask:didResumeAtOffset:expectedTotalBytes:
метод с новым объектом задачи.Для задачи данных,
NSURLSession
вызовы объектов делегатURLSession:dataTask:didReceiveResponse:completionHandler:
метод. Решите, преобразовать ли задачу данных в задачу загрузки, и затем вызвать обратный вызов завершения, чтобы продолжать получать данные или загружать данные.Если Ваше приложение принимает решение преобразовать задачу данных в задачу загрузки,
NSURLSession
вызывает делегатаURLSession:dataTask:didBecomeDownloadTask:
метод с новой задачей загрузки в качестве параметра. После этого вызова делегат не получает дальнейших обратных вызовов от задачи данных и начинает получать обратные вызовы от задачи загрузки.Если задача создавалась с
uploadTaskWithStreamedRequest:
,NSURLSession
вызывает делегатаURLSession:task:needNewBodyStream:
метод для предоставления данных организации.Во время начальной загрузки содержания организации к серверу (если применимо), делегат периодически получает
URLSession:task:didSendBodyData:totalBytesSent:totalBytesExpectedToSend:
обратные вызовы, сообщающие о прогрессе загрузки.Во время передачи от сервера делегат задачи периодически получает обратный вызов для создания отчетов о прогрессе передачи. Для задачи загрузки сеанс вызывает делегата
URLSession:downloadTask:didWriteData:totalBytesWritten:totalBytesExpectedToWrite:
метод с числом байтов, успешно записанных в диск. Для задачи данных сеанс вызывает делегатаURLSession:dataTask:didReceiveData:
метод с фактическими частями данных, поскольку они получены.Для задачи загрузки, во время передачи от сервера, если пользователь говорит Вашему приложению приостанавливать загрузку, отменяют задачу путем вызова
cancelByProducingResumeData:
метод.Позже, если пользователь просит, чтобы Ваше приложение возобновило загрузку, передайте возвращенные данные резюме любому
downloadTaskWithResumeData:
илиdownloadTaskWithResumeData:completionHandler:
метод для создания новой задачи загрузки, продолжающей загрузку, затем перейдите к шагу 3 (создающие и возобновляющиеся объекты задачи).Для задачи данных,
NSURLSession
вызовы объектов делегатURLSession:dataTask:willCacheResponse:completionHandler:
метод. Ваше приложение должно тогда решить, позволить ли кэшироваться. Если Вы не реализуете этот метод, поведение по умолчанию состоит в том, чтобы использовать кэширующуюся политику, указанную в объекте конфигурации сеанса.Если задача загрузки завершается успешно, то
NSURLSession
вызовы объектов задачаURLSession:downloadTask:didFinishDownloadingToURL:
метод с расположением временного файла. Ваше приложение должно или считать данные ответа из этого файла или переместить его в постоянное расположение в каталоге контейнера песочницы Вашего приложения перед этим методом делегата возвраты.Когда любая задача завершается,
NSURLSession
вызовы объектов делегатURLSession:task:didCompleteWithError:
метод или с ошибкой возражает или сnil
(если задача завершилась успешно).Если бы задача перестала работать, то большинство приложений должно повторить запрос пока или пользовательские отмены, загрузка или сервер возвращают ошибку при указании, что никогда не будет успешно выполняться запрос. Ваше приложение не должно сразу повторять, как бы то ни было. Вместо этого это должно использовать достижимость APIs, чтобы определить, достижим ли сервер, и должен выполнить новый запрос только, когда это получает уведомление, которое изменила достижимость.
Если задача загрузки может быть возобновлена,
NSError
объектuserInfo
словарь содержит значение дляNSURLSessionDownloadTaskResumeData
ключ. Ваше приложение должно передать это значение для вызоваdownloadTaskWithResumeData:
илиdownloadTaskWithResumeData:completionHandler:
создать новую задачу загрузки, продолжающую существующую загрузку.Если задача не может быть возобновлена, Ваше приложение должно создать новую задачу загрузки и перезапустить транзакцию с начала.
В любом случае, если передача, отказавшая по какой-либо причине кроме ошибки сервера, переходят к шагу 3 (создающие и возобновляющиеся объекты задачи).
Если ответ многослойный закодированный, сеанс может вызвать делегата
didReceiveResponse
метод снова, сопровождаемый нулем или более дополнительныйdidReceiveData
вызовы. Если это происходит, перейдите к шагу 7 (обрабатывающийdidReceiveResponse
вызовите).Когда Вы больше не нуждаетесь в сеансе, лишаете законной силы его путем вызова также
invalidateAndCancel
(для отмены выдающихся задач) илиfinishTasksAndInvalidate
(чтобы позволить выдающимся задачам закончиться прежде, чем лишить законной силы объект).После лишения законной силы сеанса, когда все выдающиеся задачи были отменены или закончились, сеанс отправляет делегата a
URLSession:didBecomeInvalidWithError:
сообщение. Когда тот метод делегата возвращается, сеанс избавляется от своей сильной ссылки делегату.
Если Ваше приложение отменяет происходящую загрузку, NSURLSession
вызовы объектов делегат URLSession:task:didCompleteWithError:
метод, как будто произошла ошибка.