Как объединить 2 издателя и стереть значения в Void?

У меня есть 2 издателя, где я хочу выполнить действие на основе любого ответа. Меня не волнуют ценности. Я пытаюсь сделать что-то вроде этого:

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

Если preferences.publisher выстрелит первым, а второй нет, я хочу выстрелить. Если state.$permissionStatus стреляет, а другой нет, я хочу выстрелить. Я действительно не хочу CombineLatest, но не знаю, как стрелять, если кто-то излучает.

Есть ли способ создать даже если огонь, но более элегантно стереть его значения?


person TruMan1    schedule 08.06.2020    source источник


Ответы (2)


Вы ищете Merge вместо CombineLatest. Ваш код для этого будет выглядеть примерно так:

var hasChangedPublisher: AnyPublisher<Void, Never> {
  preferences.publisher
    .merge(state.$permissionStatus)
    .map({ _ in
      return () // transform to Void
    })
    .eraseToAnyPublisher()
}
person donnywals    schedule 08.06.2020
comment
Поскольку у меня были несвязанные выходы, мне пришлось сделать что-то вроде этого: preferences.publisher.map {_ in ()} .eraseToAnyPublisher () .merge (with: state. $ PermissionStatus.catch {_ in Just (false)} .map {_ in ()} .eraseToAnyPublisher ()) .eraseToAnyPublisher (). Есть ли более сжатая версия для этого ?? - person TruMan1; 10.06.2020
comment
Вы можете отбросить большинство вызовов eraseToAnyPublisher (). Они полезны только для того, чтобы скрыть внутренних издателей, когда они открывают другую часть вашего кода. В этом случае вы можете написать что-то вроде preferences.publisher.map { _ in () }.merge(with: state.$permissionStatus.replaceError(true).map { _ in () }).eraseToAnyPublisher() - person donnywals; 10.06.2020

Вместо CombineLatest используйте Merge.

CombineLatest создает кортеж на основе всех объединенных издателей. Это здорово, за исключением того, что он вообще не сработает, пока каждый из объединенных издателей не уволится хотя бы один раз. После этого он будет запускаться один раз при каждом запуске любого из его объединенных издателей - (слияние последнего значения от каждого издателя в кортеж).

Вместо этого слияние просто мультиплексирует всех объединенных издателей вместе и генерирует поток событий, содержащий поток отдельных значений от любого из объединенных издателей.

person woneill1701    schedule 08.06.2020