Вы можете использовать dispatch_apply с Dispatch Global Queue для его распараллеливания, но ваш код кажется не таким эффективным при одновременной работе. Поскольку объект-аккумулятор требует монопольного доступа, и он плотно используется блоком, он вызовет гигантскую блокировку объекта-аккумулятора.
Например, этот код почти не работает одновременно, даже если использовать dispatch_apply с Dispatch Global Queue.
dispatch_semaphore_t sema = dispatch_semaphore_create(1);
dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply([array count], queue, ^(size_t index) {
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);
acc = block(acc, [array objectAtIndex:index]);
dispatch_semaphore_signal(sema);
});
dispatch_release(sema);
Вам нужно разделить блок и реализацию аккумулятора для эффективного распараллеливания.
РЕДАКТИРОВАНИЕ:
(Я не проверял алгоритм вашего кода.)
dispatch_queue_t result_queue = dispatch_queue_create(NULL, NULL);
Вы используете последовательную очередь. Последовательная очередь выполняет один блок за раз. Таким образом, это может быть
dispatch_queue_t result_queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
или
dispatch_queue_t result_queue = dispatch_queue_create(NULL, DISPATCH_QUEUE_CONCURRENT);
/* DISPATCH_QUEUE_CONCURRENT is only available OS X 10.7/iOS 4.3 or later. */