GCD vs performSelectorInBackground/performSelectorOnMainThread
Я новичок в разработке ios. У меня есть следующие вопросы:
- Когда мы используем GCD (dispatch_group_async, dispatch_async (dispatch_get_main_queue()...) и когда мы используем функцию performSelectorInBackground/performSelectorOnMainThread?
-
Каковы различия между этими двумя.
Я знаю, когда мы используем performSelectorInBackground, мы создаем новый NSThread. Но не то же самое, когда мы используем dispatch_group_async? Потому что, если мы создаем несколько dispatch_group_async, это означает, что нам нужно отправить более одного блока в очередь. И эти блоки могут работать в разных очередях. Поэтому, когда мы создаем несколько dispatch_group_async, значит, мы создаем новый поток? (потому что блоки могут работать в разных очередях) (я немного запутался в NSThread и очереди блоков.....)
Спасибо!!
Ответы
Ответ 1
Когда использовать performSelectorInBackground:
Никогда. Не используйте этот метод. Он генерирует неограниченное количество потоков. Еще до того, как GCD был доступен, это был ужасный метод.
Когда использовать performSelectorOnMainThread:
Мех... Никогда, но только потому, что это неудобно. В этом методе нет ничего глупого. Это не так полезно, как dispatch_async()
.
Разница между GCD и старыми методами performSelector…
(и NSThread
в целом) заключается в том, что GCD управляет пулом потоков для вас. В общем, вам следует избегать ручной резьбы в Cocoa. Вместо этого используйте методы NSOperationQueue
или GCD (dispatch
). Они обеспечивают более полезную абстракцию очереди, а не заставляют вас вручную управлять потоками.
Обязательно прочитайте над Apple Миграция из тем для получения дополнительной информации.
Ответ 2
На самом деле после iOS 4.0 я не могу найти ни одной причины использовать performSelectorInBackground/onMainThread. Если вам нужно что-то сделать в фоновом режиме, используйте GCD (или, лучше, NSOperationQueue
, который построен поверх GCD с 4.0 и дает большую гибкость при небольших накладных расходах), но не обязательно создавать циклы сохранения при использовании блоков.