我目前正在尝试学习 Swift+Combine,但我什至无法复制一个简单的教程。
我当前的游乐场项目如下所示:
import Combine
import Foundation
let future = Future<Int, Never> { promise in
DispatchQueue.main.asyncAfter(deadline: .now() + 2) {
print("hello")
promise(.success(1))
}
}
future.sink(receiveCompletion: { print($0) },
receiveValue: { print($0) })
print("end")
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
print(future)
}
Run Code Online (Sandbox Code Playgroud)
我期望的输出是:
end
hello
1
finished
Combine.Future<Swift.Int, Swift.Never>
Run Code Online (Sandbox Code Playgroud)
但是当我运行此代码时,输出仅显示:
end
hello
Combine.Future<Swift.Int, Swift.Never>
Run Code Online (Sandbox Code Playgroud)
它似乎吞掉了整个水槽。起初我以为当 DispatchQueue 触发回调时 future 可能已经被删除了,但事实似乎并非如此。
有人可以向我解释我做错了什么吗?
您需要存储对使用创建的订阅的引用sink,否则订阅和订阅者将立即被释放,因此不会从Future、中发出任何值Publisher。
let futureSubscription = future.sink(receiveCompletion: { print($0) },
receiveValue: { print($0) })
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |