Как сделать так, чтобы CombineLatest3 возвращал результат, если один издатель не выдал никаких значений?

У меня три издателя. Два, которые уже создали ценность, и один, который может или не может сделать это. Мне нужно объединить их и получить результат.

var changeDay = NotificationCenter.Publisher.init(center: .default, name: .NSCalendarDayChanged

    var someDate: AnyPublisher<Date, Never> {
        Publishers.CombineLatest3($someInputBool, $someInputDate, changeDay).map { (a, b, c) -> Date in
            return <someDate based on a and b, but if day changes, the result will be different.>
        }.eraseToAnyPublisher()
    }

Если день еще не изменился, CombineLatest3 ничего не вернет, так как ожидает начального значения от c перед запуском clousure. Как я могу убедиться, что CombineLatest3 вернется, даже если один издатель не отправил ни одного значения? Я использую c в качестве триггера для пересчета моей пользовательской даты.


person damian    schedule 20.04.2020    source источник


Ответы (1)


Добавьте значение издателю уведомления. Предварительно добавленный издатель немедленно сообщит:

let changeDay = NotificationCenter.default.publisher(for: .NSCalendarDayChanged)
    .map { _ in () }
    .prepend(())

Обратите внимание, что здесь я сопоставил тип Output с Void. Это означает, что мне не нужно создавать фиктивный Notification для добавления в начало, но это также означает, что переменная c в вашем закрытии не будет иметь полезного значения.

person rob mayoff    schedule 20.04.2020
comment
Просто отметим, что это работает не во всех случаях. У меня есть три довольно тщательно продуманных издателя, которых я хотел бы объединить, чтобы я мог подписаться один раз, однако только prepend() в моем случае не помог. К сожалению, мне пришлось разделить их и подписаться отдельно. - person strangetimes; 19.07.2020