串行队列/私有调度队列如何知道任务何时完成?

2023-11-22

(也许回答者是串行调度队列如何保证资源保护?但我不明白如何)

Question

gcd 如何知道异步任务(例如网络任务)何时完成?我应该使用dispatch_retain and dispatch_release以此目的?Update:我无法使用 ARC 调用这两个方法中的任何一个...该怎么办?

Details

我正在与一个进行大量网络访问的第三方库进行交互。我通过一个小类创建了一个包装器,它基本上提供了我需要的第 3 方类的所有方法,但将调用包装在dispatch_async(serialQueue) { () -> Void in (where serialQueue是我的包装类的成员)。

我试图确保对底层库的每次调用在下一次开始之前完成(不知何故,这尚未在库中实现)。


串行调度队列上的工作的序列化是在直接提交到队列的工作单元上进行的。一旦执行到达所提交的闭包的末尾(或返回),就可以执行队列上的下一个工作单元。

重要的是,任何其他可能已由闭包启动的异步任务可能仍在运行(或者甚至可能尚未开始运行),但不考虑它们。

例如,对于以下代码:

dispatch_async(serialQueue) {
    print("Start")
    dispatch_async(backgroundQueue) {
       functionThatTakes10Seconds()
       print("10 seconds later")
    }
    print("Done 1st")
}

dispatch_async(serialQueue) {
    print("Start")
    dispatch_async(backgroundQueue) {
       functionThatTakes10Seconds()
       print("10 seconds later")
    }
    print("Done 2nd")
}

输出将类似于:

Start

Done 1st

Start

Done 2nd

10秒后

10秒后

请注意,在调度第二个串行任务之前,第一个 10 秒任务尚未完成。现在,比较一下:

dispatch_async(serialQueue) {
    print("Start")
    dispatch_sync(backgroundQueue) {
       functionThatTakes10Seconds()
       print("10 seconds later")
    }
    print("Done 1st")
}

dispatch_async(serialQueue) {
    print("Start")
    dispatch_sync(backgroundQueue) {
       functionThatTakes10Seconds()
       print("10 seconds later")
    }
    print("Done 2nd")
}

输出将类似于:

Start

10秒后

Done 1st

Start

10秒后

Done 2nd

注意,这次是因为调度了10秒的任务同步地串行队列被阻塞,直到第一个任务完成后第二个任务才开始。

在您的情况下,您所包装的操作很可能会自行调度异步任务(因为这是网络操作的本质),因此串行调度队列本身是不够的。

您可以使用DispatchGroup阻止您的串行调度队列。

dispatch_async(serialQueue) {
    let dg = dispatch_group_create()
    dispatch_group_enter(dg)
    print("Start")
    dispatch_async(backgroundQueue) {
       functionThatTakes10Seconds()
       print("10 seconds later")
       dispatch_group_leave(dg)
    }
    dispatch_group_wait(dg)
    print("Done")
}

这将输出

Start

10秒后

Done

The dg.wait()阻塞串行队列,直到达到dg.leave呼叫数量匹配dg.enter来电。如果您使用此技术,那么您需要小心确保包装的操作调用的所有可能的完成路径dg.leave。也有一些变化dg.wait()需要一个超时参数。

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

串行队列/私有调度队列如何知道任务何时完成? 的相关文章

  • Swift 中 UIImages 的淡入淡出动画

    我有一组图像 我希望它们在登录屏幕的背景中淡出 我无法在 swift 中找到任何可以做到这一点的东西 有什么办法我可以做到吗 这是我当前的代码 override func viewDidLoad super viewDidLoad star
  • iOS 对 Google 云消息传递的支持

    我在谷歌的开发者控制台中看到 GCM 允许为 iOS 生成 API 密钥 我在网上搜索了有关如何在 iOS 应用程序中通过 GCM 实现推送通知的任何类型的文档 但没有找到答案 真的有可能在 iOS 应用程序中使用 GCM 实现推送通知 j
  • 如何在 Swift 语言中传递错误指针?

    我试图在 swift 中传递错误指针 但无法这样做 编译器抱怨 NSError 无法转换为 NSErrorPointer var error NSError NSError var results context executeFetchR
  • 当设置 setVisibleXRangeMaximum 时,iOS-Charts X 轴值无限重复

    我正在尝试绘制一个图表 其中 x 轴是TimeIntervalY 轴是power consumption 由于每天都会有数据 因此将有太多数据无法显示 因此 我想一次显示 5 个值 我通过设置实现了这一点self chart setVisi
  • 我无法捕获 WKWebView 的屏幕截图

    我正在尝试捕获 WKWebView 的屏幕截图 但我的方法无法正常工作 它返回纯色 就好像图层树为空一样 而它似乎适用于其他视图 UIImage screenshot UIImage screenshot UIGraphicsBeginIm
  • 如何比 CGContextStrokePath 更快地渲染线条?

    我正在使用 CGContextStrokePath 绘制约 768 个点的图表 问题是 每一秒我都会得到一个新的数据点 从而重新绘制图表 目前 这个已经很繁忙的应用程序占用了 50 的 CPU 图形绘制是在UIView 中的drawRect
  • Expo 应用程序“您的应用程序正在使用广告标识符 (IDFA)”

    我正在尝试将应用程序上传到应用程序商店 每次我上传二进制文件时 苹果都会坚持认为我的应用程序正在使用广告 而我从未实现过这样的事情 我查看了文档并删除了涉及的所有代码ASIdentifier and adIdentifier我不太确定我错过
  • 使用原始类型+大小写参数的 Swift Enum 的解决方法?

    我想创建 SKSpriteNodesWallType 请参阅下面的代码 并且仅当WallType is Corner通过它Side其方向的价值 枚举具有原始值 因为我需要将它们作为数字从 plist 加载 并能够随机创建它们 enum Si
  • 除了使用正则表达式之外,在 Swift 中解析 HTML

    下面是我想在 Swift 中解析的 HTML 代码 td class pinyin a href rsc audio voice pinyin pz yi1 mp3 span class mpt1 y span a a href rsc a
  • 将第 3 方库添加到 iPhone 应用程序时如何设置“标题搜索路径”的路径

    我想添加第 3 方库语音转文本 https github com todoroo iPhone Speech To Textto my Xcode项目 我只是拖xcodeproj文件在我的 iPhone 项目中 然后我按照目标依赖项 将二进
  • Xcode UI 测试 - 通过 id 在 Webview 中查找元素

    我们的应用程序是混合的 包含 webview 我正在尝试使用 Xcode UI 测试自动化我们的应用程序 我能够使用以下方法找到网络按钮 let app XCUIApplication app launch let button app s
  • RxSwift、RxCocoa 和 UITableview

    我在使用 RxSwift 实现 UITableView 时遇到问题 我尝试使用以下代码将模型数组的可观察对象绑定到表项 models bind to self tableView rx items cellIdentifier Cell c
  • ios - 使用 SIGPIPE 和 SIG_IGN 的信号函数

    我加入了一个旧项目 我发现了这条线 BOOL application UIApplication application didFinishLaunchingWithOptions NSDictionary launchOptions si
  • Flutter - 删除 ListView 中项目之间的空间

    我正在使用 ListView builder 函数来创建项目列表 然而 iOS 中每个项目之间的空间很大 截图 你知道如何删除项目吗 看来是默认的 因为我没有添加它 code 列表显示 return Scaffold body ListVi
  • 我正在寻找 GCDAsyncUdpSocket 上的一些示例,但发现没有一个有效

    接收数据从未被调用过 我编写了这个由我的主线调用的 swift 类UI视图控制器向接收消息的服务器发送消息 但当服务器发回响应时 客户端永远不会收到它 因为 didReceiveData 从未被触发 我一直在谷歌上搜索并查看文档 它说客户端
  • 如何确定 UINavigationController 中工具栏的高度?

    我有一个带有由 UINavigationController 呈现的工具栏的视图 当我处理 UIKeyboardWillShowNotification 时 我将整个屏幕向上滚动键盘的高度 问题是当显示键盘时 底部工具栏不显示 所以我只需将
  • 使用排序函数按 NSDates 对数组进行排序[重复]

    这个问题在这里已经有答案了 我有一个名为的模型类Event import Foundation import MapKit public class Event let id Int var title String let status
  • 如何在 iOS 5 中使用 Embed Segue?

    iOS 6 引入了 Embed Segue 允许在 Storyboard 中使用自定义容器控制器 有没有办法在 iOS 5 上复制这个 这里的挑战是子视图控制器的视图通常要添加为父视图控制器的某些容器视图的子视图 因为你不能随机进行序列UI
  • NSUserDefaults、Settings.bundle 和应用程序组

    我有一个有 2 个目标的应用程序 主应用程序和 Today 扩展 为了在这些目标之间共享设置 我打开了应用程序组功能 添加了一个组group myApp com然后使用NSUserDefaults在主应用程序和今日扩展中都是如此 var d
  • 小部件配置在 macOS 上不起作用

    我为我的 iOS 应用程序制作了一个小部件 效果很好 现在我正在将其移植到我的 macOS 应用程序中 但不知何故 小部件配置不起作用 这些项目已显示 但我无法以某种方式选择它们 查看屏幕截图 但请看一下我制作的视频 https youtu

随机推荐

  • Workflow Foundation - Literal 仅支持值类型和不可变类型 System.String

    我对名为 MyCodeActivity 的 WF 代码活动进行了以下单元测试 ExpectedException typeof ArgumentException TestMethod public void ShouldRequirePa
  • Chartjs:尝试旋转 y 轴标签

    我尝试过类似的事情maxRotate and rotate 将它们放入scaleLabel等等 我在文档中找不到任何内容 谷歌上的搜索结果也没有多大帮助 var myChart new Chart ctx type line data ch
  • 在 PHP 中包含大量文件(就像基于文件的会话一样)是否不好?

    在阅读了基于文件的 PHP 会话对于性能而言如何不是最好的之后 我开始思考 这是否意味着包含大量文件的 PHP 脚本也很糟糕 因为它包含一个文件 或者这与检索会话数据文件的方式不同 您应该使用 spl autoload register 和
  • 自动跟踪程序执行[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想知道我们是否可以在任何 C 或 C 应用程序中启用跟踪 例如 使用 gcc 选项或小工具 我将启用跟踪 并将跟踪打印在控制台上或转储到文件中 由
  • C++1z 范围的状态? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 C 委员会中有一个关于范围的研究小组 但我没有关注这个研究组的历史 并且我不确定 C 1z 预计会提供什么样的交付 而且我不使用 boost range 所以我对现有实践没有清晰的看
  • 在 SQLAlchemy 中查询混合属性

    我将文件路径存储为数据库中的相对路径 但随后使用混合属性在映射时将其转换为绝对路径 当我使用此属性查询时 它会抛出错误 这是模型 class File Base tablename files f path Column Unicode 3
  • 文本框宽度问题 - ASP.NET

    我在网站页面上有一个生成文本框的用户控件 文本框已指定宽度 但文本框间歇性地以比代码中指定的宽度小得多的宽度显示 我要求用户向我发送 查看源代码 输出的副本 以便我可以比较好结果和坏结果 我所说的 间歇性 是指类似的构建 不同的计算机 请注
  • 在商业软件中分发jquery许可证[关闭]

    Closed 这个问题是无关 目前不接受答案 我正在构建一个使用 jquery 的商业 Web 应用程序 我想我需要使用MITjquery 的许可证 因为该应用程序是商业应用程序 当我在维基百科上查看 MIT 许可证时 它说 这是一个宽松的
  • 无法连接到“localhost”上的 MySQL 服务器 (10061)

    我最近在 Windows 2003 上安装了 MySQL 5 并尝试配置实例 一切工作正常 直到我进入 应用安全设置 此时它给了我上述错误 Can t connect to MySQL server on localhost 10061 我
  • 使用ANT更新内部版本号并注入源代码

    在我的 build xml 文件中 我在属性文件中增加构建版本号 如下所示
  • Python 中的构造“ if __name__ == '__main__' ” [重复]

    这个问题在这里已经有答案了 我已经阅读了很多关于此的文章 if name main 但我不明白 我将分享你的代码 更简短的解释是什么 我创建了一个文件 ab py def a print A function in ab file a 第二
  • “git checkout --” 和有什么不一样?和“git Reset HEAD --hard”?

    这不是关于 的作用的一般问题 如标记的重复项中所示 这是一个特定于 git 的问题 要求澄清上述命令之间的操作差异 如果我想清理当前目录而不存储或提交 我通常使用以下命令 git reset HEAD hard git clean fd 一
  • 在 JSP 中编写 URL

    假设我当前的 URL 是 app jsp filter 10 sort name 我在 JSP 中有一个分页组件 它应该包含如下链接 app jsp filter 10 sort name page xxx 如何通过向当前 URL 添加新参
  • 如何在javascript中获取输入文本长度并验证用户

    我想根据输入字段右侧的长度 对于我的情况五 来验证用户在创建帐户时输入的用户名和密码是否安全 通过以不同的颜色显示 即较短 的红色 否则为绿色 我怎样才能用javascript做到这一点 JavaScript 验证并不安全 因为任何人都可以
  • 从 NIF 调用 Erlang 函数

    是否可以从 NIF 调用 Erlang 函数 回调函数 我读了文档 http www erlang org doc man erl nif html 但没有找到如何做到这一点 不 从 NIF 调用 Erlang 函数是不可能的 您可以在 E
  • 不同服务器上服务器的全局文化不同时的日期时间问题

    我的网站托管在不同位置的多个服务器上 每个地方的数据格式文化都不同 我们使用mm dd yyyy格式化每个地方 但以防某些服务器将区域性设置为dd mm yyyy然后我们的网站会生成日期时间异常 每当将字符串转换为日期时 您都应该指定要使用
  • jQuery Mobile -> 页面生命周期?

    jQuery Mobile 页面是否有类似生命周期的东西 比如在 init show hide back 或其他事件上触发的事件 提前致谢 Intro 在这里找到的所有信息也可以在我的博客中找到ARTICLE 您还将找到工作示例 页面转换期
  • Firestore 函数触发器算作读取吗?

    我知道您可能在想什么 为什么这很重要 不要为了优化定价而试图使其变得过于复杂 就我而言 我需要这样做 我在 Firestore 中有一个包含数百万条记录的集合 并且每个文档都会经常更新 每次更新时 我都需要进行一些数据清理 以及更多 所以我
  • IntelliJ IDEA 13.1 缺少运行/调试窗口

    更新我的 IntelliJ IDEA 从 13 0 3 到 13 1 后运行 调试窗口不显示 相应的菜单项在View Tool Windows已停用 我尝试编辑 idea workspace xml 或使用插件 ToolWindow Man
  • 串行队列/私有调度队列如何知道任务何时完成?

    也许回答者是串行调度队列如何保证资源保护 但我不明白如何 Question gcd 如何知道异步任务 例如网络任务 何时完成 我应该使用dispatch retain and dispatch release以此目的 Update 我无法使