RxSwift запускает наблюдаемое выполнение
У меня есть Subject
наблюдаемый, представляющий результат сетевого запроса, который должен быть доставлен нескольким подписчикам.
я могу использовать ReplaySubject
буфера 1 и publish()
метод. Однако сетевой запрос выполняется только один раз.
Я хотел бы вызвать событие извлечения в любой момент в будущем. Как я могу вызвать новый запрос?
В настоящее время у меня есть Service
объект, который содержит ReplaySubject
и имеет метод reload()
который запускает сетевой запрос и публикует результат в ReplaySubject
,
Есть ли метод на Observable
что может "обновить" его и доставить новое значение всем действующим подписчикам?
1 ответ
Если я правильно интерпретирую этот вопрос, это довольно распространенная проблема в RxSwift. Вы должны иметь возможность воссоздать ваш сетевой запрос Observable
каждый раз, когда ваша выборка "срабатывает", но вам нужно, чтобы эти результаты доставлялись по одному Observable
он создается только один раз и имеет несколько подписчиков. Это сделано с flatMap
:
struct Service {
var resultsObservable: Observable<Results> {
return resultsSubject.asObservable()
}
private let resultsSubject: ReplaySubject<Results> = .create(bufferSize: 1)
private let reloadSubject = PublishSubject<Void>()
private let disposeBag = DisposeBag()
init() {
bindFetch()
}
func reload() {
reloadSubject.onNext(())
}
private func bindFetch() {
reloadSubject
.asObservable()
.flatMap(fetch)
.bind(to: resultsSubject)
.disposed(by: disposeBag)
}
private func fetch() -> Observable<Results> {
// URLSession just one example
let urlRequest = URLRequest(url: URL(string: "https://apple.com")!)
return URLSession
.shared
.rx
.data(request: urlRequest)
.map(Results.init)
.catchErrorJustReturn(Results.empty())
}
}
В этом примере вы можете подписаться на resultsObservable
несколько раз, и каждый должен быть обновлен после нового reload()
происходит.