IdentifiableContinuation 是 CheckedContinuation
的轻量级封装,它遵循 Identifiable
协议,并包含一个易于使用的、带有 ID 的取消处理程序。
可以使用 Swift Package Manager 安装 IdentifiableContinuation。
注意: IdentifiableContinuation 需要 Xcode 15.4+ 上的 Swift 5.10 或更高版本。它可在 iOS 13+、tvOS 13+、macOS 10.15+、Linux 和 Windows 上运行。要使用 Swift Package Manager 安装,请将此添加到您的 Package.swift 文件中的 dependencies:
部分
.package(url: "https://github.com/swhitty/IdentifiableContinuation.git", .upToNextMajor(from: "0.4.0"))
在 Swift 6 中,用法与现有的 continuations 类似。
let val: String = await withIdentifiableContinuation {
continuations[$0.id] = $0
}
body 闭包在当前隔离中同步执行,允许 actors 修改其隔离状态。
当任务被取消时,会调用一个可选的取消处理程序。该处理程序是 @Sendable
类型的,可以在 body 完成之后的任何时间调用。
let val: String = await withIdentifiableContinuation {
continuations[$0.id] = $0
} onCancel: { id in
// @Sendable closure executed outside of actor isolation requires `await` to mutate actor state
Task { await self.cancelContinuation(with: id) }
}
以上内容也兼容使用 Swift 6 编译器(例如 Xcode 16)的 Swift 5 语言模式
虽然行为是相同的,但 Swift 5 编译器 (Xcode 15) 无法通过新的 #isolation
关键字 (SE-420) 继承 actor 隔离,因此必须始终传递对当前 actor 的 isolated
引用。
let val: String = await withIdentifiableContinuation(isolation: self) {
continuations[$0.id] = $0
}
IdentifiableContinuation 主要由 Simon Whitty 完成。
(完整贡献者列表)