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

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, вы можете просто бросить его в очередь операций, когда вы будете готовы его запустить. Операции предназначены для работы как с объектами, которые вы помещаете в очередь, так и при необходимости можете запускать их как автономные асинхронные методы. Поскольку вы можете легко запускать свои собственные методы работы синхронно, тестирование очень просто.

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

а ++++++++++ Будет ли подкласс снова

4b9b3361

Ответ 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.