Combine中的timeout操作符即使在事件发布后也会超时



我在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秒到达。

最新更新