Swift Combine可与PassthroughSubject连接

Swift Combine可与PassthroughSubject连接,swift,combine,Swift,Combine,我在PassthroughSubject上使用Connectable协议时遇到了困难。我想做的是能够控制PassthroughSubject何时开始向订阅者发送事件 let eventPublisher = PassthroughSubject<String, Never>().makeConnectable() let subscriber = MySubscriber() eventPublisher.subscribe(subscriber) eventPublisher.s

我在
PassthroughSubject
上使用
Connectable
协议时遇到了困难。我想做的是能够控制
PassthroughSubject
何时开始向订阅者发送事件

let eventPublisher = PassthroughSubject<String, Never>().makeConnectable()
let subscriber = MySubscriber()
eventPublisher.subscribe(subscriber)

eventPublisher.send("Hello") // Does not compile, send not found in Publisher.MakeConnectable

let cancelable = eventPublisher.connect()
// expect MySubscriber to recieve "Hello"
let eventPublisher=PassthroughSubject().makeConnectable()
let subscriber=MySubscriber()
eventPublisher.subscribe(订阅服务器)
eventPublisher.send(“Hello”)//未编译,在Publisher.MakeConnectable中未找到send
let cancelable=eventPublisher.connect()
//希望我的订户收到“你好”

我不太会组合,但我不明白在成为可连接的发布者并调用
connect()
后,如何向下游订阅服务器发送值。关于这一主题的文档非常稀少,我希望有人能告诉我如何做到这一点。

你很接近,但误解了这一点。它不会“排队”数据并在数据可用时准备发送,而是控制订阅建立的时间

一旦允许订阅(使用
.connect()
),发布服务器“处于活动状态”,订阅服务器将收到您发送的值。但是,在调用
connect()
之前发送的任何内容实际上都会被丢弃,而不是排队


也就是说,如果在最后一行之后调用
eventPublisher.send('after connect')
,订阅者将收到该消息。

听起来您想要的是CurrentValueSubject,而不是PassthroughSubject

let countPublisher = CurrentValueSubject<Int,Never>(0)

var storage = Set<AnyCancellable>()

func f() {
    self.countPublisher.value = 1
    self.countPublisher
        .sink {print($0)} // 1
        .store(in:&self.storage)
}
let countPublisher=CurrentValueSubject(0)
var storage=Set()
func f(){
self.countPublisher.value=1
自动计数出版者
.sink{print($0)}//1
.store(在:&self.storage中)
}

如您所见,我们可以在任何订户出现之前为泵注入存储值,当订户出现时,它会立即接收存储值。在这之后,我们可以说
.send
,订户将收到我们发送的任何内容

这里的示例:值得注意-CurrentValueSubject的一个副作用:您总是必须从一个值开始,一旦允许订阅任何内容,它总是在订阅过程完成后立即获得当前值。您还可以将其视为一个“只记住一个值”队列,您必须预先填充一个默认值,如果通过
.send()
未提供其他值,则将提供该默认值。是的,我当然同意。我只是想猜测OP的目的是什么,从描述中可以看出,
connect
后面紧跟着前面发送的Hello。这可能不是OP的目的,但您的解决方案确实是我所需要的!