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

时间:2019-12-23 13:51:32

标签: swift combine

我无法理解为什么在这段代码中,如果在主题已订阅send之后在subject上调用publisher,似乎事件没有被接收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 :\($0)")}

    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 :\($0)")}

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

打印

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

1 个答案:

答案 0 :(得分:1)

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

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

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