2015-10-31 2 views
0

если мы используем подход GCD для итерации, как разбить/остановить цикл после согласования условия?Как разбить петлю, если мы используем dispatch_apply?

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); 
dispatch_apply(count, queue, ^(size_t i) { 
    printf("%u\n", i); 
    //doing thread safe(also heavy) operation here 
    if (condition) { 
     //exit the loop 
    } 
}); 
+2

'dispatch_apply' не поддерживает возможности пораньше. Он не будет возвращаться до тех пор, пока все вызовы 'count' не будут завершены. Обновите свой вопрос тем, что вы пытаетесь сделать, чтобы предложить альтернативные решения. – rmaddy

+0

Спасибо за комментарий @rmaddy. Я хочу выполнить потокобезопасную операцию внутри цикла, и как только мое условие будет удовлетворено, я хочу выйти из цикла. Я обновил свой вопрос. –

+1

Почему вы думаете, что 'dispatch_apply' сделает вашу операцию безопасной? Тот факт, что вы хотите прекратить раннее, предполагает, что любая форма параллельного выполнения, вероятно, не подходит в любом случае. – Paulw11

ответ

1

Это не возможно, чтобы отменить dispatch_apply как не все операции завершены последовательно, но одновременно. Целью dispatch_apply является параллелизация цикла for, где все итерации не зависят от других итераций.

Однако вы можете использовать логическое значение, которое указывает, что условие выполнено. Все ожидающие операции немедленно отменяется по мере их вызова.

__block BOOL stop = NO; 
queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) 
dispatch_apply(count, queue, ^(size_t i) { 
    if (stop) 
     return; 
    //Do stuff 
    if (condition) 
     stop = YES; 
});