【发布时间】:2021-05-12 17:08:29
【问题描述】:
当发布者在 Swift Combine 中发送一些数据时,最好的方法是什么?让我们假设以下情况:
private var publisher: PassthroughSubject<Progress, Error>
// closure called every second:
startWithProgress() { [weak self] progress in
self.publisher.send(.init(progress: progress))
// How to call this 0.5 second after the above `send`:
self.publisher.send(.init(progress: progress + 0.5))
}
我检查了Delay API,但似乎我需要创建另一个发布者来使用它,这在我的情况下是次优的。我还检查了 throttle 和 debounce,但它们也不允许我一个接一个地发送 2 个更新,它们之间存在给定的延迟。
【问题讨论】:
-
根据您描述询问的方式,您可以将第二个电话包含在
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { ... } -
@NewDev 我认为有一种更“组合”的方式来做到这一点。比如:
self.publisher.delay(.milliseconds(500)).send(.init(progress: progress + 0.5))。基于此publisher发送的值,我正在更新视图模型中的一些@published属性,然后SwiftUI 视图将使用这些属性。我应该假设没有比直接使用 GCD 更好的方法吗? -
重点是
self.publisher.send不是Combine。这是你在说话,而不是Combine。而你延迟半秒的方式就是半秒后做,这就是asyncAfter所做的。 -
@matt 我同意是我在说,不是Combine,但
send是Subject属于Combine 框架的方法。我认为有一些方法可以使用 Combine 的 API 和概念来实现我所需要的。为您提供更多背景知识 - 在我的应用程序中,我需要与一些旧 API 进行交互,我还需要在回调中插入从这些 API 获得的结果,然后根据这些插入结果更新 SwiftUI 视图。