如果我们使用dispatch_apply,如何打破循环?

时间:2015-10-31 18:50:10

标签: ios iteration

如果我们使用GCD方法进行迭代,一旦条件匹配,如何打破/停止循环?

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
   }
});

1 个答案:

答案 0 :(得分: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;
});