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


На основе @Jon-Eric's совета я пошел с NSOperationQueue/NSOperation решение для подкласса. Это работает очень хорошо. NSOperation класс достаточно гибок, что можно использовать его с вызовами, блоками или пользовательскими подклассами, в зависимости от потребностей. Неважно, как Вы создаете Ваш NSOperation можно просто бросить его в операционную очередь, когда Вы готовы выполнить его. Операции разработаны для работы или объектами, которые Вы помещаете в очередь, или можно выполнить их как автономные асинхронные методы, если Вы хотите. Так как можно легко выполнить пользовательские методы работы синхронно, тестирование тривиально легко.

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

++++++++++ разделил бы на подклассы снова

29
задан kubi 14 June 2011 в 14:03
поделиться

2 ответа

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

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

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

Бонус:

  • NSOperationQueue имеет некоторые другие встроенные удобные конструкции, такие как изощренный способ учета приоритетов операций и зависимостей.
32
ответ дан 28 November 2019 в 01:54
поделиться

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

5
ответ дан 28 November 2019 в 01:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: