我正在尝试测试一些异步流,但我不确定我是否正确理解它们。我有以下两个示例函数:
func foo() async throws {
print("Start")
for await data in bar() {
print(data)
}
print("End")
}
private func bar() -> AsyncStream<String> {
return AsyncStream { continuation in
print("Stream Started")
for count in 0...2 {
sleep(1)
print("Yielding...")
continuation.yield("(count)")
}
continuation.finish()
}
}
我希望它打印出这样的东西:
Start
Stream Started
Yielding...
0
Yielding...
1
Yielding...
2
End
但是我看到的是:
Start
Stream Started
Yielding...
Yielding...
Yielding...
0
1
2
End
我对这个流应该如何工作的期望是错误的吗?
有2种sleep
,一种用于线程(您正在使用这个)
https://developer.apple.com/documentation/foundation/thread/1413673-sleep
和一个必须并发使用的
_: https://developer.apple.com/documentation/swift/task/sleep
private func bar() -> AsyncStream<String> {
return AsyncStream { continuation in
let task = Task{
print("Stream Started")
for count in 0...2 {
//Concurrency version of sleeping
try await Task.sleep(for: .seconds(1))
print("Yielding...")
continuation.yield("(count)")
}
continuation.finish()
}
continuation.onTermination = { _ in
//Make sure you cancel the task if the stream is terminated
task.cancel()
}
}
}
并发性与线程没有直接关系,它更多地与"actor"有关
https://developer.apple.com/wwdc21/10132