Преимущество включения NSURLSessionTask в iOS NSOperations - PullRequest
0 голосов
/ 04 апреля 2019

Может ли кто-нибудь сказать мне, каково реальное преимущество, получаемое с помощью NSURLSessionTask внутри NSOperation при выполнении сетевых вызовов http в iOS? Мы можем получить абстракцию, обернув NSURLSessionTask внутри любого другого простого пользовательского класса, например, APIRequest. Каков реальный девиз использования NSOperation для сетевых вызовов? Заранее спасибо.

1 Ответ

1 голос
/ 17 апреля 2019

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

В общем, если ваше приложение уже использует NSOperation для выполнения других задач, может быть полезно, чтобы ваши сетевые операции были просто еще одним специальным типом операций, чтобы вы могли отчасти управлять ими в так же. Конечно, если вы это сделаете, вы почти наверняка не должны использовать NSOperation напрямую; вместо этого используйте пользовательский подкласс NSOperation, который фактически знает, как отменить сетевую операцию, когда вы вызываете ее метод cancel. Использование класса NSOperation как есть может быть даже хуже, чем бесполезным, если его неправильно использовать.

Лучшее объяснение, почему я так распространен, историческое. По-видимому, многие программисты ошибочно полагали, что упаковка синхронных запросов NSURLConnection внутри объектов NSOperation позволяет им отменить эти запросы. В действительности все, что он делал, - это предотвращал получение приложением данных из запроса , но запрос продолжался до его завершения. К сожалению, при обновлении этого кода для использования NSURLSession этот унаследованный багаж часто привозили с собой в поездку, и, вероятно, сейчас он так же проблематичен, как и тогда.

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

  • Для коротких запросов это дает мало или вообще никаких преимуществ по сравнению с повторным выпуском запроса на приоритетном направлении.
  • Для длинных запросов лучше использовать фоновые загрузки / выгрузки, поскольку они значительно менее ресурсоемки (поскольку ваше приложение может быть остановлено ОС для освобождения памяти), а также потому, что у вас есть реальная гарантия того, что ОС выиграла в любом случае не убью ваш процесс.

Таким образом, преимущества использования пользовательского подкласса NSOperation такие же, как и преимущества использования NSOperation для всего остального в вашем приложении - не больше, не меньше.

...