如何合并 2 个发布者并将值擦除为 Void?

How to combine 2 publishers and erase values to Void?

我有 2 个发布商,我想根据其中任何一个响应执行操作。我不关心价值观。我正在尝试做这样的事情:

var hasChangedPublisher: AnyPublisher<(Void, Void), Never> {
    Publishers.CombineLatest(
        preferences.publisher,
        state.$permissionStatus
    ).eraseToAnyPublisher()
}

如果 preferences.publisher 先开火而不是另一个开火,我想开火。如果 state.$permissionStatus 开火但另一个不开火,我想开火。我真的不想 CombineLatest,但不确定如果其中任何一个发射如何发射。

有没有一种方法可以产生一个即使触发但更优雅地擦除其值的方法?

不要使用 CombineLatest,而是使用 Merge。

CombineLatest 基于所有合并的发布者创建一个元组。这很好,除了,它根本不会触发,直到每个合并的发布者都至少触发一次。之后,它会在每次触发它的任何组合发布者时触发一次——(将每个发布者的最后一个值合并到元组中)。

合并只是将所有合并的发布者多路复用在一起并生成事件流 - 包含来自任何合并的发布者的单一值流。

您正在寻找 Merge 而不是 CombineLatest。您的代码类似于以下内容:

var hasChangedPublisher: AnyPublisher<Void, Never> {
  preferences.publisher
    .merge(state.$permissionStatus)
    .map({ _ in
      return () // transform to Void
    })
    .eraseToAnyPublisher()
}

//转换为虚空 .map { _ }