我在Combine中使用超时运算符,我的理解是,只有当发布者不发布事件时,它才会超时,但即使发布了值,它似乎也会超时。
从文档
如果指定的时间间隔过去,并且没有从上游发布服务器接收到任何事件,则终止的发布服务器。
import PlaygroundSupport
import Combine
import Foundation
PlaygroundPage.current.needsIndefiniteExecution = true
let subject = PassthroughSubject<String, Never>()
let cancellable = subject
.timeout(.seconds(5), scheduler: DispatchQueue.main)
.sink(
receiveCompletion: { print ("completion: ($0) at (Date())") },
receiveValue: { print ("value: ($0) at (Date())") }
)
subject.send("Sending data")
/*
Prints
value: Sending data at 2021-01-06 22:41:12 +0000
completion: finished at 2021-01-06 22:41:17 +0000
*/
我对接线员的理解有错吗?。
您误解了所引用文本的含义。它说,如果指定的时间间隔过去,并且没有收到任何事件,发布者将终止,这意味着,在您的示例中,如果在前5秒内没有收到任何值。
文档还提供了一个稍微不同的示例来说明这一点。
换句话说,如果你把这个添加到你的例子中:
DispatchQueue.main.async(deadline: .now() + 3) { subject.send("in 3 seconds") }
那么你会得到以下输出:
value: Sending data at 2021-01-06 22:41:12 +0000
value: in 3 seconds at 2021-01-06 22:41:15 +0000
completion: finished at 2021-01-06 22:41:20 +0000
其中完成在最后值之后5秒到达。