为不同的订阅者设置不同层次的发布者是否合适?

Is it appropriate to have different layers of Publishers for different subscribers?

发布者管道让消费者订阅链的不同部分是否可以接受?

理论上订阅者可以在自己的管道中进行处理和过滤。但我发现拥有 'ready made' 出版商可以让消费者轻松进行。我看到这不是 Combine 通常使用的模式。这有什么我想念的缺点吗?

import UIKit
import Combine

class Publisher {
    var rootPublisher = [1, 2, 3, 4, 5].publisher
    var evenPublisher: AnyPublisher<Int, Never>

    init () {
        evenPublisher = rootPublisher.filter { num in num % 2 == 0 }.eraseToAnyPublisher()
    }
}

class Consumer {
    let publisher = Publisher()
    func numbers () {
        publisher.rootPublisher.sink { int in
            print(int)
        }
    }
    func evenNumbers() {
        publisher.evenPublisher.sink { int in
            print(int)
        }
    }
}

Consumer().numbers()
Consumer().evenNumbers()

for a pipeline of publishers to have consumers subscribe to the different parts of the chain

问题是那完全是玩具示例。在现实生活中,您会发现在任何意义上您都不会 "sharing" 相同的最终发布者,因为您的 rootPublisher 是一个 struct.

一个发布者(即管道头部的任何部分)拥有多个订阅者是完全合法的,但除非你说 share(或 multicast),否则它会变成两个独立的出版商。

But I find that having a 'ready made' publisher makes it easy for the consumer. I see that this is not the pattern generally used for Combine

事实并非如此。出售一个复杂的不透明发布者(意味着管道的头部)是非常标准的。例如,一个数据任务发布者就像一个 Deferred Future 加上一个 Map,尽管你看不到它。重点是您可以根据给定的发布商-运营商作品来弥补和销售自己的发布者(或者您可以编写自己的作品)。