Уместно ли иметь разные уровни издателей для разных подписчиков? - PullRequest
0 голосов
/ 18 марта 2020

Допустимо ли для ряда издателей, чтобы потребители подписывались на разные части цепочки?

Теоретически подписчики могут выполнять обработку и фильтрацию в своем собственном конвейере. Но я считаю, что наличие «готового» издателя облегчает жизнь потребителю. Я вижу, что это не тот шаблон, который обычно используется для 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()

1 Ответ

0 голосов
/ 18 марта 2020

для ряда издателей, чтобы потребители подписывались на разные части цепочки

Проблема в том, что это совершенно игрушечный пример. В реальной жизни вы обнаружите, что не будете «делиться» одним и тем же конечным издателем в каком-либо значимом смысле, потому что ваш rootPublisher является struct .

Это совершенно законно для издатель (имея в виду любую часть заголовка конвейера), чтобы иметь более одного подписчика, но если вы не скажете share (или multicast), он станет двумя отдельными издателями.

Но Я считаю, что наличие «готового» издателя облегчает жизнь потребителю. Я вижу, что это не тот шаблон, который обычно используется для Combine

Это не так. Торговать сложным непрозрачным издателем (имеется в виду глава конвейера) вполне стандартно. Например, издатель задач с данными - это что-то вроде отложенного будущего и карты, даже если вы этого не видите. Все дело в том, что вы можете придумать и продать своего собственного издателя, созданного для частей издателя-оператора, которые вам даны (или вы можете написать свои собственные).

...