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

Combine发布者发送完成事件后为何仍能发送值?

Combine中冷/热Publisher的行为差异解释

你的理解误区在于没区分Combine中冷Publisher和热Publisher的核心行为差异:

  • 冷Publisher(比如Just、数组的.publisher):每个新订阅者都会触发Publisher生成一次完整的事件流。也就是说,每次订阅,Publisher都会从头开始发送所有预定的值,最后发送完成事件。这就是为什么你的代码里第二个订阅者依然能收到值和完成——两次订阅是完全独立的事件流。

  • 热Publisher(比如PassthroughSubject):事件流的生命周期独立于订阅者。订阅者只能收到自己订阅之后发送的事件;当Publisher发送完成事件后,后续的订阅者只会收到完成事件,不会再获取到任何值,因为整个事件流已经结束了。

结合你提供的代码来看,Just(1)属于冷Publisher:

  • 第一次订阅时,它发送1,随后发送finished;
  • 第二次订阅时,它会重新触发完整的事件流程,再次发送1和finished,所以控制台会输出两次对应的内容。

补充常见的冷、热Publisher类型:

  • 冷Publisher:Just、Future、序列(数组/字符串等)的.publisher、URLSession.DataTaskPublisher等;
  • 热Publisher:PassthroughSubject、CurrentValueSubject、经过Publishers.Share包装后的冷Publisher等。

内容的提问来源于stack exchange,提问作者migrant

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:20:33