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

Loo*_*oth 3 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)
}
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 可能已经被删除了,但事实似乎并非如此。

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

Dáv*_*tor 6

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

let futureSubscription = future.sink(receiveCompletion: { print($0) },
        receiveValue: { print($0) })
Run Code Online (Sandbox Code Playgroud)