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

Какой из лучших GCD, NSThread или NSOperationQueue?

Какой лучший способ многопоточности в iOS, поскольку у нас есть три варианта GCD, NSThread и NSOperationQueue? Я смущен, когда один из них лучше? Если нет, то какие должны использоваться в каком сценарии и как они отличаются, а также, если у кого-то есть хороший пример использования NSOperationQueue, поделитесь тем, что я могу узнать.

4b9b3361

Ответ 1

Простой ответ:

  • Используйте NSThread (или даже API pthreads), когда вам нужно или нужно иметь прямой контроль над создаваемыми вами потоками, например. вам нужен мелкомасштабный контроль над приоритетами потоков или сопряжение с какой-либо другой подсистемой, которая напрямую vends/потребляет объекты потоков, и вам нужно оставаться на одной странице с ней. Такие случаи встречаются редко, но они происходят, особенно в приложениях реального времени.

  • Используйте GCD, когда ваша задача хорошо поддается простой распараллеливанию, например. вы просто хотите бросить какую-то работу "в фоновом режиме" с очень небольшой дополнительной работой, у вас есть некоторые структуры данных, которые вы просто хотите сериализовать доступ (и последовательные очереди отлично подходят для этого без блокировки), у вас есть для петли, которые могли бы хорошо распараллеливаться с dispatch_apply(), у вас есть источники данных/таймеры, которые API-интерфейс GCD позволит вам легко справляться с фоном и т.д. и т.д. GCD достаточно мощный, и вы можете использовать его для многого больше, чем это, но это все относительные сценарии "без проблем", где вы не хотите попасть в задачи инициализации и настройки так же, как просто "делать базовые вещи параллельно".

  • Используйте NSOperation, когда вы уже на уровне API Cocoa (vs записываете прямо в C в API POSIX) и выполняете более сложные операции, которые вы хотите распараллелить. NSOperation позволяет подклассифицировать, произвольно сложные графики зависимостей, отменять и поддерживает ряд других семантик более высокого уровня, которые могут быть вам полезны. NSOperation фактически использует GCD под обложками, поэтому каждый бит как многоядерный, многопоточный, как GCD, хотя он также приносит основу Foundation для езды, поэтому, если вы взламываете уровень POSIX, вы, вероятно, захотите использовать вариант № 2.

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

Ответ 2

В последнее время я склоняюсь к NSOperationQueue. Это использует GCD внутренне и является потокобезопасным, а также очень прост в использовании.