Замена NSURLConnection на NSURLSession

Я начал дизайн для NetworkCommunication. У меня была конструкция, в которой подклассы NSOperation создают и управляют собственными NSURLConnection. Подкласс NSOperation создается экземпляром класса NetworkManger, который добавляет его в NSOperationQueue. По завершении запроса делегат (например: ViewController будет вызываться). Это поток:

Network Manger создает экземпляр подкласса NSOperation (который инкапсулирует URL, параметры и т.д.) и добавляет его в NSOperationQueue, который он поддерживает. Подкласс NSOperation создает экземпляр NSURLConnection (который выполняет запрос asynchronous и получает данные) NSURLConnection записывает данные в подкласс NSOperation Подкласс NSOperation выполняет блок завершения, предоставленный делегатом (контроллер просмотра). Я пытаюсь реализовать тот же шаблон с NSURLSession сейчас. Я хочу иметь возможность инкапсулировать URL-адрес и параметры, необходимые для создания сетевого запроса внутри одного объекта.

Хорошо, если я использую тот же шаблон, если я использую NSURLSession. Я проверил классы AFNetworking. Но они не подклассифицировали NSOperation для NSURLSession. И, кроме того, куда должен идти объект сеанса. Будет ли он частью класса NSOperation.

Может кто-нибудь дать некоторые экспертные советы по этому поводу. Я должен иметь возможность отменять запросы, загружать (POST/PUT), загружать данные. Класс Network Manager был бы единственной точкой контакта для любого сетевого запроса.

Ответ 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, но это немного хлопот, если вам нужна передача на основе делегата.