【问题标题】:How to make CombineLatest3 return result if one publisher hasn't produced any values?如果一个发布者没有产生任何值,如何让 CombineLatest3 返回结果?
【发布时间】:2020-04-20 17:17:04
【问题描述】:

我有三个出版商。两种已经产生了价值,另一种可能会也可能不会。我需要将它们组合起来并产生输出。

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 将不会返回任何内容,因为它会在运行 clousure 之前等待来自 c 的初始值。即使一个发布者没有发出单个值,我如何确保 CombineLatest3 返回?我在这里使用c 作为触发器来重新计算我的自定义日期。

【问题讨论】:

    标签: ios swift uikit combine


    【解决方案1】:

    为通知发布者添加一个值。前置发布者将立即发出信号:

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

    请注意,我已将 Output 类型映射到 Void 这里。这意味着我不必创建一个虚拟的 Notification 来添加前缀,但这也意味着闭包中的 c 变量将没有有用的值。

    【讨论】:

    • 请注意,这似乎不适用于所有情况。我有三个非常精心组合的发布者,我想合并它们,这样我就可以订阅一次,但是 prepend() 单独对我的情况没有帮助。不幸的是,我不得不将它们分开并单独订阅。
    猜你喜欢
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 2014-03-18
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多