【问题标题】:How to break the loop if we are using dispatch_apply?如果我们使用 dispatch_apply,如何打破循环?
【发布时间】:2015-11-01 04:10:07
【问题描述】:

如果我们使用 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
   }
});

【问题讨论】:

  • dispatch_apply 不支持任何提前停止的功能。在所有 count 调用完成之前,它不会返回。用您正在尝试做的事情更新您的问题,以便提供替代解决方案。
  • 感谢@rmaddy 的评论。我想在循环内执行线程安全操作,一旦满足我的条件,我想退出循环。我已经更新了我的问题。
  • 为什么你认为dispatch_apply 会让你的操作线程安全?您想提前终止这一事实意味着任何形式的并行执行都可能不适合。

标签: ios iteration


【解决方案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;
});

【讨论】:

  • 太棒了。将其包装为“break”的类比;在 for 循环中。 “继续”呢?如何在不取消其他迭代的情况下“跳转”到当前块的末尾?
  • 你可以return;
  • 确实如此。就像一个魅力,即使它在 Obj-C 代码的上下文中看起来有点奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-18
  • 2022-11-16
相关资源
最近更新 更多