Новое в объединении и реактивном программировании, поэтому помощь очень ценится.
У меня есть следующий сценарий: я хотел бы создать пользовательский интерфейс, где пользователь может фильтровать контент с помощью различных «фильтров» кнопки на странице. Когда пользователь нажимает одну из кнопок, мне нужно отбросить запрос API для получения данных.
Теперь у меня есть издатель, который предоставляет мне «состояние» этих выборов, и я мой код структурирован так:
state
.publisher /* sends whenever 'state' updates behind the scenes */
.debounce(for: 1.0, scheduler: DispatchQueue.main)
.map { /* create some URL request */ }
.flatMap {
URLSession.shared.dataTaskPublisher(for: someRequest)
.map { $0.data }
.decode(type: MyResponseType.self, decoder: JSONDecoder())
}.sink(receiveCompletion: { (completion) in
/// cancelled
}) { (output) in
/// go show my results
/// Ideally, this is only called when the most recent API call finishes!
}.store(in: &cancellables)
Однако в этой реализации есть ошибка в следующем сценарии: если одно событие переходит в flatMap для запуска запроса, а последующее событие делает то же самое до сетевой вызов завершается, затем мы дважды вызовем обработчик завершения.
Предпочтительно, мы каким-то образом отменяем внутренний конвейер, поэтому выполняем обработчик завершения только с самым последним событием.
Как Могу ли я «отменить» этот внутренний конвейер (запущенный dataTaskPublisher), когда новые события проходят по конвейеру без разрушения внешнего конвейера?