【发布时间】:2021-11-01 23:03:15
【问题描述】:
有没有人成功地创建了一个 AsyncStream 并设置了它的 onTermination 处理程序?我做不到。以下内容是直接从提案 (https://github.com/apple/swift-evolution/blob/main/proposals/0314-async-stream.md) 复制和粘贴的,除了我通过将 detach 现代化为 Task.detached 来摆脱警告:
let t = Task.detached {
func make123Stream() -> AsyncStream<Int> {
AsyncStream { continuation in
continuation.onTermination = { 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()
看起来不错,但它不能编译,而且我找不到让它编译的方法。 onTermination setter 上的错误消息如下:
Converting non-concurrent function value to
'@Sendable (AsyncStream<Int>.Continuation.Termination) -> Void'
may introduce data races
我不知道编译器要我做什么。有没有人解决这个问题,解决办法是什么?
(我已经为此提交了一个错误。)
【问题讨论】:
标签: swift async-await swift5.5 swift-concurrency