NSThread против NSOperationQueue против??? на iPhone
В настоящее время я использую NSThread
для кэширования изображений в другом потоке.
[NSThread detachNewThreadSelector:@selector(cacheImage:) toTarget:self withObject:image];
В качестве альтернативы:
[self performSelectorInBackground:@selector(cacheImage:) withObject:image];
В качестве альтернативы я могу использовать NSOperationQueue
NSInvocationOperation *invOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(cacheImage:) object:image];
NSOperationQueue *opQueue = [[NSOperationQueue alloc] init];
[opQueue addOperation:invOperation];
Есть ли причина отказаться от NSThread
? GCD - это четвертый вариант, когда он выпущен для iPhone, но если не будет значительного увеличения производительности, я бы предпочел придерживаться методов, которые работают на большинстве платформ.
Основываясь на совете @Jon-Eric, я пошел с подклассом NSOperationQueue
/NSOperation
. Он работает очень хорошо. Класс NSOperation
достаточно гибкий, чтобы вы могли использовать его с помощью вызовов, блоков или пользовательских подклассов в зависимости от ваших потребностей. Независимо от того, как вы создаете свой NSOperation
, вы можете просто бросить его в очередь операций, когда вы будете готовы его запустить. Операции предназначены для работы как с объектами, которые вы помещаете в очередь, так и при необходимости можете запускать их как автономные асинхронные методы. Поскольку вы можете легко запускать свои собственные методы работы синхронно, тестирование очень просто.
Я использовал эту же технику в нескольких проектах, так как я задал этот вопрос, и я не мог быть счастливее, так как мой код и мои тесты были чистыми, организованными и счастливо асинхронными.
а ++++++++++
Будет ли подкласс снова
Ответы
Ответ 1
В общем, вы получите лучший пробег с NSOperationQueue
.
Три конкретные причины:
- Возможно, вы захотите инициировать кеширование многих элементов одновременно.
NSOperationQueue
достаточно умен, чтобы создавать только столько потоков, сколько есть ядер, очередей остальных операций. С помощью NSThread
создание 100 потоков для кэширования 100 изображений, вероятно, слишком велико и несколько неэффективно.
- Вы можете отказаться от операции
cacheImage
. Выполнять отмену проще с помощью NSOperationQueue
; большая часть работы уже сделана для вас.
-
NSOperationQueue
теперь может перейти к более умной реализации (например, Grand Central Dispatch) сейчас или в будущем. NSThread
скорее всего будет всего лишь потоком операционной системы.
Bonus:
-
NSOperationQueue
имеет некоторые другие хорошие конструктивные элементы, такие как сложный способ соблюдения приоритетов операций и зависимостей.
Ответ 2
Я бы использовал NSOperationQueue
. В OS 3.2, NSOperationQueue
использует потоки под капотом, поэтому два метода должны выполняться аналогичным образом. Однако в Mac OS 10.6 NSOperationQueue
использует GCD под капотом, и поэтому имеет преимущество в том, что не имеет накладных расходов отдельных потоков. Я не смотрел документы на OS 4, но я подозреваю, что он делает что-то похожее - в любом случае NSOperationQueue
может заменять реализации, если/когда преимущества производительности GCD станут доступными для iPhone.