NSThread против NSOperationQueue против ???на iPhone - PullRequest
29 голосов
/ 15 июня 2010

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

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

A ++++++++++ Подкласс снова

Ответы [ 2 ]

32 голосов
/ 15 июня 2010

В целом вы получите больший пробег при NSOperationQueue.

Три конкретных причины:

  • Возможно, вы захотите начать кэширование сразу нескольких элементов.NSOperationQueue достаточно умен, чтобы создать только столько потоков, сколько имеется ядер, ставя в очередь оставшиеся операции.При NSThread создание 100 потоков для кэширования 100 изображений, вероятно, является излишним и несколько неэффективным.
  • Возможно, вы захотите отменить операцию cacheImage.Реализовать отмену проще с NSOperationQueue;большая часть работы уже сделана для вас.
  • NSOperationQueue может перейти к более разумной реализации (например, Grand Central Dispatch) сейчас или в будущем.NSThread, скорее всего, всегда будет просто потоком операционной системы.

Бонус:

  • NSOperationQueue имеет некоторые другие хорошие встроенные конструкции, такие каксложный способ соблюдения приоритетов и зависимостей.
5 голосов
/ 15 июня 2010

Я бы использовал NSOperationQueue. В ОС 3.2 NSOperationQueue использует потоки под капотом, поэтому оба метода должны работать одинаково. Однако в Mac OS 10.6 NSOperationQueue использует GCD под капотом и имеет то преимущество, что не имеет накладных расходов на отдельные потоки. Я не смотрел документы для OS 4, но подозреваю, что он делает что-то похожее - в любом случае, NSOperationQueue может поменять реализацию, если / когда преимущества GCD для iPhone станут доступны.

...