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
相关产品推荐
相关产品推荐

