很多iOS开发开始学习结构化并发时已经用过了很多年Grand Central Dispatch,虽然从思想上二者区别很大,但是利用熟悉的东西去理解新的事物有助于提升学习理解的效率,接下来是这Grand Central Dispatch常见使用代码和转换代码。
异步
| // 原代码 |
| DispatchQueue.global().async { |
| print("1") |
| DispatchQueue.main.async { |
| print("3") |
| } |
| print("2") |
| } |
| |
| // 转换 |
| Task.detached { |
| print("1") |
| async let _ = await MainActor.run { |
| //也可以用 Task { @MainActor in |
| print("3") |
| } |
| print("2") |
| } |
结合信号量实现的异步串行
| // 源代码 |
| DispatchQueue.global().async { |
| let s = DispatchSemaphore(value: 0) |
| DispatchQueue.global().async { |
| sleep(2) // 模拟耗时操作 |
| print("1") |
| s.signal() |
| } |
| s.wait() |
| |
| DispatchQueue.global().async { |
| sleep(1) // 模拟耗时操作 |
| print("2") |
| s.signal() |
| } |
| s.wait() |
| |
| print("3") |
| } |
| // 转换 |
| Task.detached { |
| await Task { |
| sleep(2) // 模拟耗时操作 |
| print("1") |
| }.value // .value必不可少 |
| |
| await Task { |
| sleep(1) // 模拟耗时操作 |
| print("2") |
| }.value |
| |
| print("3") |
| } |
结合信号量实现的异步并行
| // 源代码 |
| DispatchQueue.global().async { |
| let s = DispatchSemaphore(value: 0) |
| DispatchQueue.global().async { |
| print("part1:1 or 2") |
| s.signal() |
| } |
| |
| DispatchQueue.global().async { |
| print("part2:1 or 2") |
| s.signal() |
| } |
| s.wait() |
| s.wait() |
| |
| print("3") |
| } |
| // 转换 |
| Task.detached { |
| async let a1: () = await Task { |
| print("part1:1 or 2") |
| }.value |
| |
| async let a2: () = await Task { |
| print("part2:1 or 2") |
| }.value |
| |
| let (_, _) = await(a1, a2) |
| print("3") |
| } |

【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)