В документации для Subject протокола структуры Apple Combine есть это описание для функции send(subscription: Subscription):

Этот вызов предоставляет Subject возможность установить спрос на любые новые подписки вышестоящего уровня.

Есть аналогичные функции send на Subject, которые позволяют публиковать либо значение Output, либо значение Void, но до сих пор неясно, как тип Subject будет использовать отправленную ему подписку или что это означает.

В настоящее время Combine предоставляет только два типа, соответствующие Subject: CurrentValueSubject< /a> и PassthroughSubject, ни один из них не имеет документации для своих send(subscription: Subscription) реализации.

Что означает для типа, соответствующего Subject, иметь "подписку вверх по течению"? Нисходящая подписка для Subject будет создана для чего-то, что подписывается на этот субъект, но какова будет цель вышестоящей подписки здесь? Если возможно, приведите примеры из реальной жизни.

1
Max Desiatov 24 Ноя 2019 в 17:12

2 ответа

Как в CurrentValueSubject, так и в PassthroughSubject объекты существуют, чтобы позволить непосредственному коду иметь дескриптор для взаимодействия и публикации в механизме типа Combine Publisher/async. При этом они действуют на уровне издателей, что означает, что они должны соблюдать довольно строгий жизненный цикл издателя Combine.

У меня есть общий обзор этого жизненного цикла в Использование Combine, которое вы можете просмотреть для быстрого обзора. Чтобы ответить на ваш более конкретный вопрос, ожидается, что издатель не будет публиковать какие-либо значения, пока подписчик не подключится и не отправит запрос по запросу.

API, представленный в Subject, — это send(), общая форма которого используется для отправки значений подписчикам, если они подписались. Когда вы используете Subject в любой форме, вам обычно не нужно возиться с отправкой для подписчика, позволяя общим экземплярам обрабатывать все механизмы подписки и ответа.

Таким образом, вам действительно нужно реализовать его только в том случае, если вы создаете свой собственный объект, соответствующий Subject, то есть создаете свою собственную реализацию Subject, а не строите один из двух вариантов, которые Apple уже предоставила.

Этот конкретный метод позволяет вам отвечать на запросы на подписку, позволяя вам записывать и создавать нотации (при необходимости) для обработки распределения спроса, которое приходит вместе с подпиской. Каждая подписка, полученная от подключающихся подписчиков, имеет некоторый идентификатор, в классах отслеживайте всех подписчиков и их subscriptions по мере их создания.

Лично мне гораздо проще построить одну из существующих тем, составив из нее все, что мне нужно для публикации обновлений.

0
heckj 18 Дек 2019 в 03:19
Спасибо! Я думаю, это объясняет, что такое нисходящая подписка для субъекта, но что такое «восходящая подписка» в этом контексте?
 – 
Max Desiatov
18 Дек 2019 в 22:30
Подписка «вверх по течению» — это подписка, которую субъект делает на что-либо, когда он подключен к цепочке. Когда вы работаете с субъектами, обычно не существует связанной подписки, как у оператора. Вместо конкретной подписки это обычно происходит с более немедленными вызовами .send() для передачи данных. Тем не менее, как сам издатель, Субъект должен иметь возможность отвечать на подписки, что является основой метода, о котором вы спрашивали.
 – 
heckj
20 Дек 2019 в 01:39
И в чем тогда разница между вышестоящей подпиской и нижестоящей подпиской?
 – 
Max Desiatov
20 Дек 2019 в 15:27
Что касается предмета, определить сложнее - для общих «операторов» в Combine (вещи, которые действуют как издатель и подписчик): - восходящие потоки - это издатели, на которых вы подписаны и которые предоставляют публикуемые значения по запросам запроса - нисходящие потоки являются подписчиками, которым вы публикуете и которым вы предоставляете значения по запросу
 – 
heckj
20 Дек 2019 в 22:18

Метод 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
0
TopChul 12 Июл 2022 в 15:50