Жизненный цикл сеанса 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: метод, как будто произошла ошибка.