具有异步解析的未来不会触发

时间:2020-05-14 16:05:16

标签: swift combine

我目前正在尝试学习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触发回调时可能已经删除了将来,但事实并非如此。

有人可以向我解释我在做什么错吗?

1 个答案:

答案 0 :(得分:1)

您需要存储对使用sink创建的订阅的引用,否则订阅和订阅者将被立即释放,因此Future不会发出任何值, Publisher

let futureSubscription = future.sink(receiveCompletion: { print($0) },
        receiveValue: { print($0) })