如何在继续之前等待经过dispatch_async?

2024-02-27

我正在执行一系列的dispatch_async,我只想在它们全部完成后更新UI。问题是dispatch_async 中的方法在单独的线程中调用某些内容,因此它会在数据完全加载之前返回,并且在加载所有内容之前调用dispatch_group_notify。

所以我引入了一个无限循环来让它等待,直到设置一个标志。 这是最好的方法吗?请参阅下面的代码。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

for (...) {
  dispatch_group_async(group, queue, ^{
    __block BOOL dataLoaded = NO;

    [thirdPartyCodeCallWithCompletion:^{
       dataLoaded = YES;
    }];

    // prevent infinite loop
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), 
    queue, ^{
          dataLoaded = YES;
    });

    // infinite loop to wait until data is loaded
    while (1) {
       if (dataLoaded) break;
    }
  }

  dispatch_group_notify(group, dispatch_get_main_queue(), ^{
    //update UI
  });
}

您已经了解调度组。为什么不直接使用dispatch_group_wait(),其中包括对超时的支持?您可以使用dispatch_group_enter() and dispatch_group_leave()而不是dispatch_group_async()直到第三方调用完成的内部块完成后,该组才完成。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
dispatch_group_t group = dispatch_group_create();

for (...) {
  dispatch_group_enter(group);
  dispatch_async(queue, ^{
    [thirdPartyCodeCallWithCompletion:^{
       dispatch_group_leave(group);
    }];
  }
}

dispatch_group_wait(group, dispatch_time(DISPATCH_TIME_NOW, NSECS_PER_SEC));
dispatch_async(dispatch_get_main_queue(), ^{
  //update UI
});

指某东西的用途dispatch_group_wait()确实使此代码同步,如果在主线程上运行,这会很糟糕。根据超时后到底应该发生什么,您可以使用dispatch_group_notify()像你一样并使用dispatch_after()只是更新 UI,而不是试图假装该块已完成。


更新:我调整了我的代码以确保“更新 UI”发生在主队列上,以防万一该代码尚未在主线程上。

顺便说一句,我只用过dispatch_async()对于调用的块thirdPartyCodeCallWithCompletion:因为你原来用过dispatch_group_async()我不确定假设的方法是异步的。不过,大多数采用完成块的 API 都是异步的。如果是的话,那么您可以直接调用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在继续之前等待经过dispatch_async? 的相关文章

随机推荐

  • awk 如何将 unix 命令的结果作为参数?

    假设有一个带有制表符分隔字段的输入文件 第一个字段是整数 1 abc 1 def 1 ghi 1 lalala 1 heyhey 2 ahb 2 bbh 3 chch 3 chchch 3 oiohho 3 nonon 3 halal 3
  • 在 Windows UWP 应用程序中将 Python 与 C# 一起使用

    我开始使用 Python 编写应用程序 但现在想切换到 C 和 UWP 我知道您无法使用 Python 编写 UWP 应用程序 但我正在尝试查看是否可以使用 Python 编写一些代码并从 C 访问该代码 例如 用 Python 编写一个
  • 将 BPMN 2.0 XML 导入 MS Visio 2010 或从 MS Visio 2010 导出 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想将 BPMN 图表从 Visio 2010 Premium 导出为 BPMN 2 0 XML 格式
  • 从 noflo 开始,从 nodejs 运行它

    我运行了一个简单的 noflo 示例来自诺弗洛 但我没有弄清楚 noflo 应该如何与节点和其他代码一起工作 起初我有这个 fbp 文件 In the graph we first need to define the nodes and
  • 非关联浮点加法示例

    我正在写一篇关于浮点数的文章 我在 Javascript 控制台中放入了一些简单的测试来尝试 我正在寻找非交换加法的示例 即 x y z z x y 如果您有一些有效的 x y z 值 谢谢 没有这样的例子 因为按照 IEEE 754 的定
  • 为什么在此示例中并行版本比顺序版本慢?

    在过去的几天里 我学习了一些关于并行性的知识 并且遇到了this http msdn microsoft com en us library dd460703 aspx例子 我将它与顺序 for 循环并排放置 如下所示 private st
  • Jenkins 作业窗口批量执行比 cmd.exe 中执行慢 20 倍

    我刚刚在 Windows 2012 Server o 上安装了 Jenkins 2 46 2 它作为系统服务运行 我创建了一个执行 Windows 批处理 bat 脚本来构建代码项目的作业 此批处理会执行 2 个 mingw32 make
  • 如何按数字对文件进行排序?

    我正在处理目录中的一些文件 需要对文件进行数字排序 我发现了一些关于排序的例子 特别是使用lambda模式 在wiki python org http wiki python org moin HowTo Sorting 我把它放在一起 i
  • 为什么 html5 视频循环每次迭代都会创建请求

    I have 禁用缓存勾选已删除 但每次视频循环迭代仍发出请求 仅在 chrome 上 What Initiator Otherchrome 检查器网络部分的意思是什么 第一次从主机加载视频 但之后所有请求都从主机加载Other 每次迭代视
  • SAPUI5图标存储在哪里?

    我有一个基于 SAPUI5 的应用程序 在其中使用 SAP 站点下图标的 url 设置按钮图标https sapui5 hana ondemand com iconExplorer html https sapui5 hana ondema
  • 将父元素替换为其内容

    我正在尝试做与这个问题类似 相同的事情 如何在JavaScript中仅删除父元素而不删除其子元素 https stackoverflow com questions 170004 how to remove only the parent
  • React router dom:路由和路由器根本不工作

    我对反应相当陌生 并尝试使用react router dom进行重定向 我按照文档做了所有事情 但我的代码似乎不起作用 我收到一条关于找不到元素的错误 我不明白是什么原因造成的 另外 我现在只是尝试使用地址栏访问该页面 而不是使用任何按钮或
  • Jquery datepicker beforeShowDay 初始化后

    当我在初始化后设置 beforeShowDay 时 它不起作用 dater datepicker dater datepicker beforeShowDay renderCalendarCallback 当我第一次更改并在 ShowDay
  • Laravel 从公共目录中删除目录

    如何从公用文件夹中删除目录 现在我尝试这个 Storage deleteDirectory directory 但这看起来在存储文件夹中 您可以使用Illuminate Filesystem Filesystem为了这 Laravel 提供
  • 消除作为模板参数传递的重载成员函数指针的歧义

    我正在尝试重新创建观察者模式我可以完美地将参数转发给观察者的给定成员函数 如果我尝试传递一个地址成员函数其中有多次覆盖 它无法根据参数推导出正确的成员函数 include
  • python的跨平台usb模块?

    我有兴趣在 python 中使用 USB 设备进行一些跨平台工作 关于可以执行此类操作的模块有任何提示或建议吗 我浏览了 SF 和 googlecode 但运气不佳 thanks ct PyUSB http pyusb berlios de
  • QPainterPath 与直线的交点(通过 x 求 QPainterPath y)

    我有 QPainterPath 我需要通过 x 找到 QPainterPath 的 y 坐标 我在 QPainterPath 中找到了 intersected 方法 因此 我创建了新的 QPainterPath 它是具有 x 坐标的从路径边
  • 如何使用java获取weka中的最近邻居

    我一直在尝试使用与 weka 机器学习库一起使用的 Ibk 最近邻算法 我知道如何对实例进行分类 但我想实现协同过滤功能 因此我需要实际获取最接近感兴趣对象的实际对象列表 在 weka 中我实际上该如何使用它的 java API 来做到这一
  • 在Erlang中如何获取客户端的ip和端口?

    在下面的代码中 服务器正在侦听端口 2345 接受客户端的连接后 它返回 ok Socket start gt ok Listen gen tcp listen 2345 binary packet 4 reuseaddr true act
  • 如何在继续之前等待经过dispatch_async?

    我正在执行一系列的dispatch async 我只想在它们全部完成后更新UI 问题是dispatch async 中的方法在单独的线程中调用某些内容 因此它会在数据完全加载之前返回 并且在加载所有内容之前调用dispatch group