结合订阅和从主题发送,为什么顺序很重要?

Combine subscribe and send from subject, why does order matter?

我不明白为什么在这段代码中,如果我在订阅主题 publisher 之后在 subject 上调用 send,似乎事件不是subscriber 收到。

如果我将 send 调用移动到 subscribe 函数之前,则会列出所有项目 (10,20,1,2,3)

    let publisher = [1,2,3].publisher
    let subject = PassthroughSubject<Int, Never>()
    let subscriber = subject.sink { print("value :\([=10=])")}

    publisher.subscribe(subject)
    subject.send(10)
    subject.send(30)

这会打印

value: 1
value: 2
value: 3

同时:

    let publisher = [1,2,3].publisher
    let subject = PassthroughSubject<Int, Never>()
    let subscriber = subject.sink { print("value :\([=12=])")}

    subject.send(10)
    subject.send(30)           
    publisher.subscribe(subject)

打印

value: 10
value: 30
value: 1
value: 2
value: 3

这可能是根据集合创建的任何发布者的实现细节。在您的第一个示例中,发布者可能实际上并不关心随后出现的值。它在发送自己的值后用 finished 调用自己的完成。

在您的第二个示例中,您在主题中预先填充了值。这可能是因为集合发布者的实现将其自己的值附加到订阅时上游的任何值。

不过,您为什么要让您的发布商订阅该主题?你想在这里完成什么?