首页 > 解决方案 > 即使在发布事件后,Combine 中的 timeout 运算符也会超时

问题描述

我在组合中使用超时运算符,我的理解是只有在发布者不发布事件时它才会超时,但即使发布了一个值,它似乎也会超时。

文档

如果指定的时间间隔过去而没有从上游发布者接收到事件,则终止的发布者。

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
*/

我对运营商的理解有误吗?

标签: iosswiftcombine

解决方案


你误解了你引用的文字的意思。它表示,如果指定的时间间隔过去而没有收到任何事件,则发布者将终止,这意味着,在您的示例中,如果在前 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 秒到达。


推荐阅读