В настоящее время я использую 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
можно просто бросить его в операционную очередь, когда Вы готовы выполнить его. Операции разработаны для работы или объектами, которые Вы помещаете в очередь, или можно выполнить их как автономные асинхронные методы, если Вы хотите. Так как можно легко выполнить пользовательские методы работы синхронно, тестирование тривиально легко.
Я использовал эту ту же технику в горстке проектов, так как я задал этот вопрос, и я не мог быть более доволен способом, которым это сохраняет мой код и мои тесты чистыми, организованными и счастливо асинхронными.
++++++++++ разделил бы на подклассы снова
В целом вы увеличите пробег с NSOperationQueue
.
Три конкретных причины:
NSOperationQueue
достаточно умен, чтобы создать примерно столько потоков, сколько имеется ядер, ставя в очередь оставшиеся операции. С NSThread
создание 100 потоков для кэширования 100 изображений, вероятно, является излишним и несколько неэффективным. cacheImage
.Реализовать отмену проще с NSOperationQueue
; большая часть работы уже сделана за вас. NSOperationQueue
может свободно переключиться на более интеллектуальную реализацию (например, Grand Central Dispatch) сейчас или в будущем. NSThread
, скорее всего, всегда будет просто потоком операционной системы. Бонус:
NSOperationQueue
имеет некоторые другие встроенные удобные конструкции, такие как изощренный способ учета приоритетов операций и зависимостей. Я бы использовал NSOperationQueue
. В OS 3.2 NSOperationQueue
использует внутренние потоки, поэтому оба метода должны работать одинаково. Однако в Mac OS 10.6 NSOperationQueue
использует GCD под капотом и поэтому имеет то преимущество, что не требует дополнительных затрат на отдельные потоки. Я не смотрел документацию для OS 4, но подозреваю, что она делает что-то подобное - в любом случае NSOperationQueue
может поменять местами реализации, если / когда преимущества GCD станут доступны для iPhone. .