【问题标题】:Swift Concurrency announced for iOS 13 in Xcode 13.2 - how did they achieve this?Xcode 13.2 中为 iOS 13 宣布的 Swift Concurrency - 他们是如何实现这一目标的?
【发布时间】:2021-12-13 04:49:47
【问题描述】:

Xcode 13.2 Beta release notes 承诺支持 iOS 13 的 Swift 并发。

您现在可以在部署到 macOS 10.15、iOS 13、tvOS 13 和 watchOS 6 或更高版本的应用程序中使用 Swift Concurrency。这种支持包括异步/等待、参与者、全局参与者、结构化并发和任务 API。 (70738378)

但是,早在 2021 年夏季,当它首次出现在 WWDC 上时,它就很难仅在 iOS 15+ 上运行。

我的问题是:发生了什么变化?他们是如何实现向后兼容的?它的运行方式是否与它在 iOS 15 中的运行方式截然不同?

【问题讨论】:

    标签: ios swift xcode async-await concurrency


    【解决方案1】:

    将并发反向部署到较旧的操作系统版本将并发运行时库与您的应用程序捆绑在一起,并提供此功能所需的支持,就像 Swift 在 Swift 5 中 ABI 稳定性之前使用标准库所做的那样,当时 Swift 可以随操作系统提供。

    这捆绑了标准库的部分Concurrency (stable link) 以及一些用于功能的additional support and stubs (stable link)。

    当部署到足够新的操作系统版本以包含这些运行时功能作为操作系统的一部分时,不需要此捆绑。


    由于 iOS 15+(和相关的操作系统版本)上的功能被声明需要内核更改(对于新的协作线程模型),而这些更改本身不能向后移植,因此某些功能的实现包括基于现有功能的填充程序 确实存在于这些操作系统上,但它们的性能可能略有不同,或者效率较低。

    您可以在 Doug Gregor's PR 的一些地方看到这一点,用于反向移植并发性 — 在一些地方,检查 SWIFT_CONCURRENCY_BACK_DEPLOYMENT 会更改某些假设不再成立或功能不存在的实现。例如,GlobalExecutor 不能假设 dispatch_get_global_queue 是协作的(因为旧操作系统上不存在线程模型),所以在向后移植时,它必须 create its own queue 用作全局协作队列。基于@objc 的actors 还有need to have their superclass swizzled,这不需要在非后台部署的运行时发生。 (符号还必须在某些地方注入到 backdeploy 库中,并且某些行为必须被删除,但这有点不那么有趣。)

    总体而言,没有关于反向部署与非反向部署之间确切差异的全面文档(没有阅读所有代码),但可以安全地假设有效 后部署的库的行为将是相同的,但可能会以性能为代价。

    【讨论】:

      猜你喜欢
      • 2012-07-03
      • 1970-01-01
      • 2016-10-03
      • 2020-05-29
      • 2018-03-19
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多