如何压缩两个发布者,但获取最新值而不是默认的最旧 zip 行为?


我需要使用Swift构建一个Combine

管道,其中涉及 2 个发布者,pubA(A PassThroughSubject)频繁生成值,一旦 pubB(另一个 PassThroughSubject)生成值,我需要使用 pubA 中的最新值来触发事件。唯一严格的条件是 - 触发器应仅发生在 pubB(驱动发布者)的新值上,并且管道应从 pubA 获取最新发布的值(应跳过旧值)。让我尝试用示例来演示:

pubA => 
1               
2               
3               
4
5 
pubB =>                  true                     false       true
Expected Output:         (true, 3)                (false, 5)  (true, 5)

这似乎对Zip最初有好处,但 zip 弹出旧值而不是最新值,即输出变为(真,1),(假,2)。并且每当有任何发布者的值时combineLatest使用触发器事件并打破依赖关系以仅触发pubB的新值,因此输出变为(true,3),(true,4),(true,5),(false,5)

感谢任何指示。

编辑备注:

  1. 期望是获得一对值。
  2. pubB 是驱动发布者,对于来自 pubB 的每个值,将使用来自 pubA 的最新值来创建一个事件。
  3. 如果 pubA 没有产生任何值,它将等到 pubA 产生一个值......因为我们需要一对。
  4. 如果 pubB 产生的值多于 pubA,则最新的 pubA 值将与最新的 pubB 值配对。

这是我为满足我的确切要求而想出的最终代码。我不愿意编写从 RxSwift 到 Combine 的自定义 pub-sub 或 portcombineLatestFrom。 感謝@matt指導我採取正確的方法,他在此回答:Swift Combine 算子具有相同的功能,如 RxSwift 框架中的"withLatestFrom">

import Combine
import Foundation
let pub1 = PassthroughSubject<Int, Never>()
let pub2 = PassthroughSubject<Bool, Never>()
var subscriptions = Set<AnyCancellable>()
pub2.map { value in (unique: UUID(), value: value) }
.combineLatest(pub1)
.removeDuplicates {
return $0.0.unique == $1.0.unique
}
.map { (tuple) in
return (tuple.0.1, tuple.1)
}
.sink { event in
print(event)
}
.store(in: &subscriptions)
pub1.send(1)
pub1.send(2)
pub1.send(2)
pub1.send(3)
pub2.send(true)
pub1.send(4)
pub1.send(5)
pub2.send(false)
pub2.send(true)

输出为: (真, 3)
(假, 5)
(真, 5)

相关内容

  • 没有找到相关文章

最新更新