ios - 即使在发布事件后,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
*/
我对运营商的理解有误吗?
解决方案
你误解了你引用的文字的意思。它表示,如果指定的时间间隔过去而没有收到任何事件,则发布者将终止,这意味着,在您的示例中,如果在前 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 秒到达。
推荐阅读
- android - 我在我的 gradle 上找不到 SHA-1 指纹证书,因为它没有显示 :app 文件夹
- eclipse - syso 快捷方式在 Eclipse IDE 中不起作用
- python - Python用其他字符串替换所有非ASCII字符串
- stripe-payments - 如何获得每位客户的总收入
- python - Python:为什么我指定的输出路径中的单反斜杠在输出时变为双反斜杠并导致FileNotFoundError?
- ios - 使用 JSONDecoder 的 Swift Codable JSON 解析错误
- python - 如何让 python 程序与 Chrome Dino 游戏交互?
- oracle - 错误:PLS-00320:此表达式类型的声明不完整或格式错误
- web-scraping - 如何使用 XLM 和电子表格提取 Twitter 关注者编号
- python - 如何让我的机器人在命令前缀之后检测到消息?