You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使CombineLatest在某一发布者未发射时仍响应另一发布者变化?

解决CombineLatest未触发的问题

你的问题核心在于CombineLatest的特性:它要求所有上游发布者都至少发射过一个值,才会输出组合后的结果。而settings.objectWillChange是PassthroughSubject<Void, Never>,这类Subject在没有主动发送值之前是没有任何输出的,所以只有当它和$aPublishedProperty都各自发送过至少一次值后,你的sink才会被触发。

要实现「只要任意一个发布者变化就触发,且不需要等待objectWillChange的初始值」,有两种常用方案:

方案一:给objectWillChange添加初始值

通过prepend(())给objectWillChange的序列开头添加一个Void类型的初始值,这样它就能满足CombineLatest的「至少一个值」要求,后续不管是aPublishedProperty变化还是objectWillChange触发,都会触发sink:

Publishers.CombineLatest(
    settings.objectWillChange.prepend(()), // 添加初始Void值
    $aPublishedProperty
)
.sink(receiveValue: { _, _ in
    // Do something…
})
.store(in: &subscriptions)

这个方案的好处是,你依然能在sink中拿到两个发布者的最新值(虽然你现在用不到objectWillChange的Void值),如果后续需要用到aPublishedProperty的最新值,这个写法依然适用。

方案二:使用Merge替代CombineLatest

如果你完全不需要两个发布者的组合值,只是想在任意一个变化时触发逻辑,那么用Publishers.Merge更直接——它会把两个同类型的发布者合并成一个序列,只要任意一个发布者发送值,就会触发sink。你只需要把$aPublishedProperty转换成Void类型,和objectWillChange保持一致:

Publishers.Merge(
    settings.objectWillChange,
    $aPublishedProperty.map { _ in () } // 将属性变化转换成Void值
)
.sink(receiveValue: {
    // Do something…
})
.store(in: &subscriptions)

这个写法更轻量,适合你只需要触发逻辑、不需要获取最新值的场景。

内容的提问来源于stack exchange,提问作者Clément Cardonnel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:47:46