Когда я должен использовать Thread, но DispatchQueue на iOS?

#ios #multithreading #grand-central-dispatch

#iOS #многопоточность #grand-central-dispatch

Вопрос:

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

Комментарии:

1. Поток полностью находится под вашим контролем и делает то, что вы хотите. GCD — это очередь, которая выполняет поставленные в нее действия либо по одному, либо одновременно. У них очень разные варианты использования, и это довольно широкая тема, чтобы начать объяснять все. В общем, если вам нужно запустить единицу работы и, возможно, не заботиться о том, когда она завершится, просто поставьте ее в очередь. Если вы хотите, чтобы какой-то код выполнялся одновременно все время полностью под вашим контролем, thread, вероятно, то, что вам нужно.

2. Apple дает подробные рекомендации здесь (короткий ответ заключается в том, что вы не будете использовать потоки вручную в iOS; за 11 лет, прошедших с момента выхода GCD, я использовал (NS) Thread примерно 3 раза, и 2 из них были ошибками, которые я позже удалил): developer.apple.com/library/archive/documentation/General /…

3. (Но @SamiKuhmonen прав, и я не согласен. В некоторых операциях реального времени, таких как аудио, может иметь смысл получить полный контроль с помощью долговечного потока. Но IMO, если вам действительно нужны потоки, вы должны сначала работать на C . Если ваш код имеет смысл в Swift или ObjC с ARC и небрежными обещаниями производительности, то вам, вероятно, не нужен контроль потока, управляемого вручную.)

4. @SamiKuhmonen Спасибо, я прочитал документ Apple, и я знал разницу между thread и GCD. Я просто не могу найти условия, используя thread, но GCD. Ваш ответ мне очень помог.

5. Ваш код, который использует threads вне контекста GCD, может быть кроссплатформенным кодом. Или код, предшествующий GCD. Или код, который имеет какое-то законное использование потоков. Но очень редко можно увидеть явный код потока в мире GCD. Очевидно, что мы не можем помочь вам решить, было ли использование потоков законным или просто плохое программирование, не видя, что делает код. Не стесняйтесь добавлять репрезентативный пример того, что делает код потока в вашем вопросе. В отсутствие этого очень сложно ответить на этот вопрос…

Ответ №1:

pthread часто используется в кроссплатформенном коде, поэтому вы, скорее всего, столкнетесь с этим, когда будете включать сторонние библиотеки в свой код, и обычно не трогаете его.

Использование NSThread было бы очень, очень, очень редким. За исключением вызова [NSThread isMainThread], чтобы определить, выполняется ли ваш код в основном потоке или в фоновом потоке. Если у вас нет действительно веских причин поступать иначе, используйте GCD. В основном потому, что это настолько проще в использовании, что внезапно вы будете использовать многопоточность в местах, где вы бы никогда не использовали ее иначе.

Комментарии:

1. Спасибо за вашу помощь. Итак, в iOS нет условия с использованием thread, но GCD?