Swift AsyncStream迭代等待结束



我正在尝试测试一些异步流,但我不确定我是否正确理解它们。我有以下两个示例函数:

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

最新更新