在Swift Combine中,是;根“;对象总是一个主题?

在Swift Combine中,是;根“;对象总是一个主题?,swift,swift5,combine,Swift,Swift5,Combine,在苹果公司的WWDC视频《Swift Combine》中,他们总是使用《NSNotificationCenter》作为信息发布者。但是,发布者似乎没有任何能力按需发送消息。该功能似乎位于主题中 我假设主题必须是任何发布链的根对象,对吗?苹果提供了两个内置主题:CurrentValueSubject和PassthroughSubject 但是我假设我可以使用适当的协议编写我自己的主题 在Swift Combine中,发布者是一种描述对象的协议,该对象可以随时间传输值 主题是一个扩展的发布者,它知道

在苹果公司的WWDC视频《Swift Combine》中,他们总是使用《NSNotificationCenter》作为信息发布者。但是,
发布者
似乎没有任何能力按需发送消息。该功能似乎位于
主题中

我假设
主题
必须是任何
发布链
的根对象,对吗?苹果提供了两个内置主题:
CurrentValueSubject
PassthroughSubject

但是我假设我可以使用适当的协议编写我自己的
主题

在Swift Combine中,发布者是一种描述对象的协议,该对象可以随时间传输值

主题是一个扩展的发布者,它知道如何强制发送

Publisher和Subject都不是具有实现的具体类;它们都是协议

查看发布者协议(记住,主题是扩展发布者):

只要您保存了对已连接的任何/所有订阅者的引用,您的发布者就可以通过在订阅者上调用
receive
轻松地将更改发送到管道中。但是,您必须自己管理订户和差异更改

主题的行为相同,但它只是提供一个
send
函数供其他人调用,而不是将更改流式传输到管道中。Swift提供的两个具体主题具有存储等附加功能


TL;灾难恢复更改不会发送给发布者,而是发送给订阅者。主题是可以接受一些输入的发布者。

是的,但我肯定错过了一些明显的东西,因为我看不出没有
主题的消息实际上是如何发送给发布者的。我可以看到它在链中之后是如何传递的,但只有
Subject
协议上有
send()
方法。如果我有一个自定义类要从中广播更改,那么我为其他人订阅而公开的
发布者必须是
主题,否则我的自定义类实际上如何向订阅者发送消息?非常感谢。我仍然感到困惑的是,出版商之间的链接是如何发挥作用的。我有一个自定义类,它是发布者。它在阵列中跟踪接收到的每个订户。当它想要发送消息时,它迭代数组并在每个
订户上调用
receive()
。这基本上是旧的具有多个代理的Obj-C代理模式。我的自定义发布服务器如何公开自身,以便我可以与
debounce()
等链接,或者
Subscriber
可以创建自己的
Publisher
链。合成是使用接受输入发布服务器和输出订阅服务器的运算符完成的。苹果已经扩展了发布者协议,为普通运营商添加了功能(链接),但如果您正在构建自己的运营商,则需要手动订阅发布者并添加下游订阅者。例如,只需初始化一个debounce操作符并将其连接(或在发布服务器上使用.debounce()),我会的。我仍然不明白这些操作符是如何连接的。如果我的自定义类是一个
发布者
,并且引用了它的所有
订阅者
,那么如上所述,它只需在每个
订阅者
上调用
receive
。如果我的类创建了一个
debounce
操作符,并将每个
订户连接到它,那么我的类如何通过
debounce
操作符“发送”消息,然后将消息发送给每个
订户
?如果我在自定义类中使用
Subject
作为根对象,这是有意义的,但当我的类本身是
Publisher
时就没有意义了。Debounce是您的发布者可以访问的订阅者,因此无论何时调用
receive
,您实际上是在向Debounce发送数据,而不是向订阅者发送数据。换句话说,运营商既是订阅者(您的发布者)又是发布者(您的订阅者或链中的下一个运营商)。您需要查看代码以进一步了解这一点,但通常运营商是发布商外部的(除非您只是包装现有发布商)。
public protocol Publisher {

    associatedtype Output

    associatedtype Failure : Error

    func receive<S>(subscriber: S) where S : Subscriber, Self.Failure == S.Failure, Self.Output == S.Input
}
public protocol Subscriber : CustomCombineIdentifierConvertible {
...

    /// Tells the subscriber that the publisher has produced an element.
    ///
    /// - Parameter input: The published element.
    /// - Returns: A `Demand` instance indicating how many more elements the subcriber expects to receive.
    func receive(_ input: Self.Input) -> Subscribers.Demand
}