簡體   English   中英

Swift Concurrency 在 Xcode 13.2 中為 iOS 13 宣布 - 他們是如何實現這一目標的?

[英]Swift Concurrency announced for iOS 13 in Xcode 13.2 - how did they achieve this?

Xcode 13.2 Beta 發行說明承諾為 iOS 13 提供 Swift 並發支持。

您現在可以在部署到 macOS 10.15、iOS 13、tvOS 13 和 watchOS 6 或更高版本的應用程序中使用 Swift Concurrency。 這種支持包括異步/等待、參與者、全局參與者、結構化並發和任務 API。 (70738378)

然而,早在 2021 年夏季,當它首次出現在 WWDC 時,它就很難被限制只能在 iOS 15+ 上運行。

我的問題是:發生了什么變化? 他們是如何實現向后兼容的? 它的運行方式是否與在 iOS 15 中的運行方式截然不同?

將並發回部署到較舊的操作系統版本將並發運行時庫與您的應用程序捆綁在一起,並提供此功能所需的支持,就像 Swift 在 Swift 5 中的 ABI 穩定之前使用標准庫所做的那樣,當時 Swift 可以隨操作系統。

這捆綁了標准庫的並發部分( 穩定鏈接)以及一些額外的支持和功能存根穩定鏈接)。

當部署到足夠新的操作系統版本以包含這些運行時功能作為操作系統的一部分時,這種捆綁不是必需的。


由於 iOS 15+(和相關操作系統版本)上的功能被聲明需要內核更改(對於新的協作線程模型),而這些內核本身無法向后移植,因此某些功能的實現包括基於這些操作系統上確實存在的現有功能的墊片,但其性能可能略有不同,或者效率較低。

您可以在Doug Gregor 的SWIFT_CONCURRENCY_BACK_DEPLOYMENT移植並發PR中的幾個地方看到這一點——在一些地方,您可以看到檢查SWIFT_CONCURRENCY_BACK_DEPLOYMENT ,這改變了某些假設不再成立或功能不存在的實現。 例如, GlobalExecutor在向后移植時不能依賴於獲取全局 Dispatch 隊列作為其主要共享隊列,而必須創建自己的供使用。 基於@objc的 actor還需要讓他們的超類 swizzled ,這不需要在非后台部署的運行時發生。 (符號還必須在某些地方注入到后台部署庫中,某些行為必須被剔除,但這有點不那么有趣。)

總的來說,沒有關於后台部署和非后台部署之間的確切區別的全面文檔(沒有閱讀所有代碼),但可以安全地假設后台部署庫的有效行為將是相同的,盡管可能在性能成本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM