Асинхронная задача и несколько наблюдателей с RxSwift - PullRequest
0 голосов
/ 23 октября 2018

У меня есть одна проблема, и я не знаю, как это исправить.

В моей ViewModel я получил поле Observable со значением.

self.diseaseDetails = Observable<Disease>.create { (observer) -> Disposable in

            _ = SAPI.get().diseases(diseases: 5, success: { (disease) in
                observer.on(.next(disease))
                observer.on(.completed)

            }) { (failedMessage) in
                observer.on(.completed)
            }

            return Disposables.create()
        }

И получаю данные из наблюдаемых какthis:

public func getSections() -> Observable<String?> {
        return self.details().map { $0.sections }
    }

    public func getDiagnostics() -> Observable<String?> {
        return self.details().map { $0.diagnostics }
    }

private func details() -> Observable<Disease> {

        return Observable.of(
            self.disease.asObservable(),
            self.diseaseDetails.take(1)
        ).merge()
    }

Но в этом примере было сделано два запроса.Мне нужно только один запрос для многих подписок.Есть идеи?

1 Ответ

0 голосов
/ 23 октября 2018

Ответ ...

Чтобы обеспечить только один сетевой запрос, вам нужно сделать Observable горячим, вызвав на него .share().В этом случае вы также можете настроить воспроизведение так, чтобы .share(replay: 1).Однако имейте в виду, что это будет означать, что diseaseDetails будет только когда-либо делать один запрос, а затем выкладывать этот ответ каждый раз, когда его просят.При нынешней структурированности вашего кода это означает отсутствие обновления.

Объяснение ...

Работа потоков заключается в том, что когда вы подписываетесь на Observable, подписка поднимается вверхпоток до самого источника, и он вызывает замыкание, которое вы дали функции create.Таким образом, по умолчанию каждая подписка вызывает замыкание, которое содержит вашу функцию SAPI.get()... (это называется «холодной» наблюдаемой). Однако существуют другие способы создания Observables и способы короткого замыкания этойповедение.Когда это происходит, наблюдаемая считается «горячей».Оператор .share() является одним из таких способов.Когда поступит первый запрос на подписку, он подпишется на вышестоящую Наблюдаемую, но для любого последующего запроса на подписку он просто добавит нового наблюдателя в свой список и отправит любые последующие ответы новому наблюдателю.Если вы скажете оператору «replay: n», он сохранит последние n события из своей наблюдаемой восходящей линии и сразу же отправит их новым подписчикам при подключении.

И некоторые советы ...

Вы явно игнорируете результат вашего сетевого запроса (код _ = SAPI.get()...).Весьма вероятно, что результатом этой функции является объект, который позволяет отменять запросы, и поэтому он должен использоваться в вашем Disposables.create для осуществления отмены.

...