AsyncStream设置onTermination handler报Sendable编译错误如何解决?
AsyncStream设置onTermination编译报错解决方案
报错的核心原因是onTermination要求传入@Sendable类型的闭包,Swift后续正式版本增加了严格的并发安全校验,而原Swift演进提案的示例代码编写时该校验还未落地,所以会出现编译错误。
修正后的代码如下:
let t = Task.detached { func make123Stream() -> AsyncStream<Int> { AsyncStream { continuation in // 给闭包加上@Sendable标注即可解决编译报错 continuation.onTermination = { @Sendable termination in switch termination { case .finished: print("Regular finish") case .cancelled: print("Cancellation") } } Task.detached { for n in 1...3 { continuation.yield(n) sleep(2) } continuation.finish() } } } for await n in make123Stream() { print("for-in: \(n)") } print("After") } sleep(3) t.cancel()
如果是Xcode 14及以上版本开启了严格并发检查,也可以选择配置全局闭包隐式Sendable推断规则,但直接给对应闭包手动添加@Sendable标注的兼容性最好,是更推荐的写法。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

