Я ищу способ предварительно получить данные и кэшировать их без каких-либо подписок, сделанных для этого подписчика, или при первой подписке.
Например :
products = getProducts.shareReply(scope : forever)
И когда новые подписчики подписываются, он должен получать последние данные. Если подписчиков нет, не следует перезапускать этого издателя при следующей подписке, вместо этого он должен возвращать последние кэшированные данные.
Я уже использую оператор shareReply с многоадресной рассылкой, настраиваемым ReplaySubject и автоматическим подключением, но если в следующий раз, когда у издателя нет подписок, он перезапустит издателя и будут получены новые данные. И я этого не хочу.
Это код для оператора shareReply:
extension Publisher {
func shareReplay(_ bufferSize: Int = 1) -> AnyPublisher<Output, Failure> {
return multicast(subject: ShareReplySubject(bufferSize))
.autoconnect()
.eraseToAnyPublisher()
}
}
@JoakimDanielson Я знаю об этом, но я хотел бы превратить AnyPublisher в нечто вроде Behavior (CurrentValue) Subject. Я имею в виду, что хочу превратить anyPublisher в «горячего издателя», и поэтому он выдает данные независимо от того, есть ли подписчик или нет.





I'm aware of it but I would like to turn AnyPublisher to something like Behaviour(CurrentValue)Subject I mean I want to turn anyPublisher to "hot publisher" and so it emits data regardless of if there is a subscriber or not.
Вы можете сделать это, применив оператор multicast и вызвав connect по результату:
let (sharedProducts, sharedProductsTicket): (AnyPublisher<[Product], Never>, Cancellable) = {
let pub = getProducts()
.multicast(subject: CurrentValueSubject([]))
return (pub.eraseToAnyPublisher(), pub.connect())
}()
Теперь sharedProducts имеет действующую подписку на getProducts() и хранит последнее значение, опубликованное getProducts(). Любой, кто подписывается на sharedProducts, немедленно получает последнее значение и новые значения по мере их поступления.
Вызов pub.connect() возвращает Cancellable, который при уничтожении отменяет внутреннюю подписку, соединяющую getProducts() с CurrentValueSubject. Так что вам нужно где-то хранить этот билет. В моем примере я храню его в sharedProductsTicket.
Возможно, вам стоит изучить такие темы, как CurrentValueSubject, stackoverflow.com/questions/60482737/…