2017 / Swift 3.1-GCD против NSOperation

я погружаюсь немного глубже в параллелизм и много читал о GCD и NSOperation. Тем не менее, много сообщений, таких как canonic ответ на SO несколько лет.

мне показалось, что NSOperation основные преимущества раньше были,ценой некоторого представления:

  • "путь", как правило, больше, чем простая отправка как абстракция высшего уровня (построенная поверх GCD)
  • сделать манипуляция задач (отмена и т. п.) намного проще
  • чтобы легко настроить зависимости между задачами

приведенный НОД по DispatchWorkItem & заблокировать отмена / DispatchGroup / qos в частности, действительно ли есть стимул (с точки зрения затрат) использовать NSOperation больше для параллелизма, кроме случаев, когда вам нужно отменить задачу, когда она начала выполнять или запрашивать состояние задачи ?

Apple, похоже, уделяет гораздо больше внимания GCD, по крайней мере в их WWDC (конечно, это более недавнее, чем NSOperation).

2 ответов


Я вижу, что у каждого из них все еще есть своя цель. Я недавно перемотал разговор 2015 WWDC об этом (Advanced NSOperations), и я вижу здесь два основных момента.

Время Выполнения И Взаимодействие С Пользователем

из разговора:

NSOperations работают немного дольше, чем вы ожидаете от блока, поэтому блоки обычно занимают несколько наносекунд, возможно, не более миллисекунды.

NSOperations, на с другой стороны, может быть намного дольше, где-то от пары миллисекунд до нескольких минут

пример, о котором они говорят, находится в приложении WWDC, где существует NSOperation, которая зависит от наличия зарегистрированного пользователя. Зависимость NSOperation представляет контроллер представления входа в систему и ожидает аутентификации пользователя. После завершения этой NSOperation завершается, и NSOperationQueue возобновляет свою работу. Я не думаю, что вы захотите использовать GCD для этого сценарий.

наследование

с NSOperations всего занятия, вы можете их подкласса, чтобы получить больше пользы из них. Это невозможно с GCD.

пример: (используя сценарий входа WWDC сверху)

У вас есть много NSOperations в вашей базе кода, которые связаны с пользовательским взаимодействием, которое требует их проверки подлинности. (Нравится видео, в этом примере.) Вы можете расширить NSOperation для создания AuthenticatedOperation, затем все эти NSOperations расширяют этот новый класс.


во-первых, NSOperationQueue позвольте вам enqueue операции, то есть какие-то асинхронные операции с start метод, a cancel способ и несколько наблюдаемых свойств, в то время как с очередью отправки можно представить блок или закрытие или функции в очередь отправки, которая затем будет выполнена.

"операция" семантически принципиально отличается от Блока (или замыкания, функции). - операция имеет базовую асинхронную задачу, в то время как блок (закрытие или функции) - это просто.

что это NSOperation, хотя, это асинхронные