我目前正在尝试学习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)
}
我原本希望作为输出:
end
hello
1
finished
Combine.Future<Swift.Int, Swift.Never>
但是当我运行此代码时,输出仅显示:
end
hello
Combine.Future<Swift.Int, Swift.Never>
似乎吞没了整个水槽。起初,我以为DispatchQueue触发回调时可能已经删除了将来,但事实并非如此。
有人可以向我解释我在做什么错吗?
答案 0 :(得分:1)
您需要存储对使用sink
创建的订阅的引用,否则订阅和订阅者将被立即释放,因此Future
不会发出任何值, Publisher
。
let futureSubscription = future.sink(receiveCompletion: { print($0) },
receiveValue: { print($0) })