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

Combine中PassthroughSubject发送.finished后如何重新订阅接收新值

问题原因

Combine 遵循 Reactive Streams 规范,所有 Publisher 的生命周期都是单向不可逆的:

  • 一个 Publisher 最多只能发送一次 completion 事件(包括 .finished 和 .failure 两种类型)
  • 一旦 Publisher 发送了 completion 事件,就会进入终结状态,后续所有新的订阅都会立即收到这个完成回调,所有新调用 send(_:) 传入的值都会被直接丢弃。

你代码里在第一次发送完 test1 后主动触发了 .finished,所以后续的第二次订阅直接收到完成事件,test2 也不会被转发。


解决方案

根据业务场景可以选择以下两种常用方案:

方案1:移除主动发送的 .finished 事件

如果业务场景不需要通过 finished 事件标记流的终结,直接删掉主动触发完成的代码即可,修改后代码如下:

import Combine

let subject = PassthroughSubject<String, Never>()

// 第一个订阅
subject
.sink(receiveCompletion: { completion in
    print("Received completion:", completion)
}, receiveValue: { value in
    print("Received value:", value)
})

subject.send("test1")
// 移除这行主动触发完成的代码
// subject.send(completion: .finished)

// 第二个订阅
subject
.sink(receiveCompletion: { completion in
    print("Received completion:", completion)
}, receiveValue: { value in
    print("Received value:", value)
})

subject.send("test2")

运行后输出:

Received value: test1
Received value: test2
Received value: test2

两个订阅都会收到 test2,符合预期。


方案2:每次需要新的事件流时重建 Subject

如果你确实需要在单次任务结束时发送 finished 标记,后续又要处理新的独立事件流,就不要复用同一个已终结的 Subject,每次新建实例即可:

import Combine

var subject = PassthroughSubject<String, Never>()

// 第一个订阅逻辑
subject
.sink(receiveCompletion: { completion in
    print("Received completion:", completion)
}, receiveValue: { value in
    print("Received value:", value)
})

subject.send("test1")
subject.send(completion: .finished)

// 新建新的Subject实例处理后续事件
subject = PassthroughSubject<String, Never>()
// 第二个订阅
subject
.sink(receiveCompletion: { completion in
    print("Received completion:", completion)
}, receiveValue: { value in
    print("Received value:", value)
})

subject.send("test2")

运行后输出:

Received value: test1
Received completion: finished
Received value: test2

也能正常拿到 test2 的值。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:18:02