В настоящее время я использую 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 ++++++++++
Подкласс снова