Изменить
Я прочитал некоторые статьи о блоках и быстром перечислении, GCD и т.п. @Bbum, который написал много статей по теме GCD и блоков, говорит, что методы перечисления блоков всегда бывают быстрыми или быстрыми, чем быстрые эквиваленты перечисления. Вы можете прочитать его рассуждения здесь.
Хотя это был увлекательный интеллектуальный разговор, я согласен с теми, кто сказал, что это действительно зависит от поставленной задачи.
У меня есть некоторые задачи для выполнения, и мне нужно, чтобы они выполнялись быстро, дешево и эффективно. Apple дает нам много вариантов того, как мы хотим перечислять массив, но я не уверен, что выбрать.
Быстрое перечисление
for (id obj in array)
{
/* Do something with |obj|. */
}
Перечисление неконкурентных блоков
[array enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
Параллельное перечисление блоков
[array enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL *stop) {
/* Do something with |obj|. */
}];
Применить GCD
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_apply([array count], queue, ^(size_t idx) {
id obj = [array objectAtIndex: idx];
/* Do something with |obj|. */
});
GCD Async Apply
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_async(queue, ^(void) {
dispatch_apply([array count], queue, ^(size_t idx) {
id obj = [array objectAtIndex: idx];
/* Do something with |obj|. */
});
});
Или возможно что-то с NSBlockOperation
или NSOperationQueue
?
TIA, Алекс.