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() происходит.

Другие вопросы по тегам