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
, хотя, это асинхронные