Подтвердить что ты не робот

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 и очереди блоков.....)

Спасибо!!

4b9b3361

Ответ 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 и дает большую гибкость при небольших накладных расходах), но не обязательно создавать циклы сохранения при использовании блоков.