Ответ 1
Update:
NSURLConnection
является устаревшим эффективным Mac OS 10.11 и iOS 9. Итак, в этот момент NSURLSession
следует использовать вместо NSURLConnection
. Поскольку заголовок NSURLConnection.h
говорит:
Устаревший: Класс
NSURLConnection
больше не должен использоваться.NSURLSession
является заменойNSURLConnection
.
Мой первоначальный ответ ниже.
Ответ зависит от того, нужно ли вам богатство различных методов делегата NSURLSession
или нет. Если вы в порядке используете исполнения блока завершения (т.е. Никаких обратных вызовов прогресса, потоковой передачи и т.д.), Преобразование с NSURLConnection
в NSURLSession
довольно тривиально. Просто разместите экземпляр NSURLSession
в своем классе NetworkManager
, а затем заверните экземпляры на основе NSURLSessionTask
на основе делегата в параллельном подклассе NSOperation
, и все готово. Просто примените стандартный асинхронный/параллельный шаблон NSOperation
подкласса.
Если вы используете референции на основе делегатов NSURLSession
, это целый другой чайник рыбы. Основная проблема состоит в том, что различные методы делегата NSURLSessionTask
вызываются в сеансе delegate
, а не в деле делегирования задачи. На первый взгляд это может показаться тривиальной проблемой, но если у ваших экземпляров операций есть уникальные блоки завершения/прогресса, например, вы застряли в том, что у вас есть карта объектов сеанса для этих обратных вызовов метода делегата для отдельного пользователя исходные экземпляры операции запроса.
Чтобы решить эту проблему, вам необходимо поддерживать сопоставление идентификаторов задач с объектами подкласса NSOperation
. Затем вы можете реализовать эти задачи NSURLSessionTask
(включая задачу задачи, задачи загрузки и загрузки) делегировать методы в соответствующем подклассе NSOperation
. Затем класс сетевого менеджера NSURLSession
может, когда он получает вызов делегата NSURLSessionTask
, использует идентификатор задачи для идентификации соответствующего экземпляра NSOperation
, а затем вызывает соответствующий метод делегирования.
Наконец, если вы собираетесь обрабатывать фоновые экземпляры NSURLSession
, жизнь становится еще сложнее (потому что фоновые задачи будут продолжаться даже после того, как ваше приложение завершится и все его объекты будут отброшены). Фоновые сессии просто не поддаются подходу NSOperation
.
Нижняя строка, это тривиально, если вам нужны только методы-блокировки NSURLSession
, но это немного хлопот, если вам нужна передача на основе делегата.