В документации для Subject
протокола структуры Apple Combine есть это описание для функции send(subscription: Subscription)
:
Этот вызов предоставляет
Subject
возможность установить спрос на любые новые подписки вышестоящего уровня.
Есть аналогичные функции send
на Subject
, которые позволяют публиковать либо значение Output
, либо значение Void
, но до сих пор неясно, как тип Subject
будет использовать отправленную ему подписку или что это означает.
В настоящее время Combine предоставляет только два типа, соответствующие Subject
: CurrentValueSubject
< /a> и PassthroughSubject
, ни один из них не имеет документации для своих send(subscription: Subscription)
реализации.
Что означает для типа, соответствующего Subject
, иметь "подписку вверх по течению"? Нисходящая подписка для Subject
будет создана для чего-то, что подписывается на этот субъект, но какова будет цель вышестоящей подписки здесь? Если возможно, приведите примеры из реальной жизни.
2 ответа
Как в CurrentValueSubject
, так и в PassthroughSubject
объекты существуют, чтобы позволить непосредственному коду иметь дескриптор для взаимодействия и публикации в механизме типа Combine Publisher/async. При этом они действуют на уровне издателей, что означает, что они должны соблюдать довольно строгий жизненный цикл издателя Combine.
У меня есть общий обзор этого жизненного цикла в Использование Combine, которое вы можете просмотреть для быстрого обзора. Чтобы ответить на ваш более конкретный вопрос, ожидается, что издатель не будет публиковать какие-либо значения, пока подписчик не подключится и не отправит запрос по запросу.
API, представленный в Subject, — это send()
, общая форма которого используется для отправки значений подписчикам, если они подписались. Когда вы используете Subject в любой форме, вам обычно не нужно возиться с отправкой для подписчика, позволяя общим экземплярам обрабатывать все механизмы подписки и ответа.
Таким образом, вам действительно нужно реализовать его только в том случае, если вы создаете свой собственный объект, соответствующий Subject, то есть создаете свою собственную реализацию Subject, а не строите один из двух вариантов, которые Apple уже предоставила.
Этот конкретный метод позволяет вам отвечать на запросы на подписку, позволяя вам записывать и создавать нотации (при необходимости) для обработки распределения спроса, которое приходит вместе с подпиской. Каждая подписка, полученная от подключающихся подписчиков, имеет некоторый идентификатор, в классах отслеживайте всех подписчиков и их subscriptions
по мере их создания.
Лично мне гораздо проще построить одну из существующих тем, составив из нее все, что мне нужно для публикации обновлений.
Метод send(subscription: )
, используемый в Publishers.Multicast.
Многоадресная рассылка сделает конвейер таким образом.
[upstream: some Publisher]
-> [Multicast]
-> [Subject]
-> [Subscriber: like Sink, Assign]
Субъект должен потребовать от Multicast
восходящего потока, когда любой Subscriber
требует некоторых.
Поэтому Subject
должен знать о подписке восходящего потока при использовании с многоадресной рассылкой.
Если только один экземпляр Subject
для SomeValue Publishing, такой как @Published
, не будет использовать эти методы. Но при использовании с Multicast
будет использоваться этот метод.
Смотрите также
// operator
func multicast<S>(() -> S) -> Publishers.Multicast<Self, S>
// Publishers.Multicast
final class Multicast<Upstream, SubjectType>
where Upstream : Publisher,
SubjectType : Subject,
Upstream.Failure == SubjectType.Failure,
Upstream.Output == SubjectType.Output
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.