RXSwift flatMap два метода

У меня есть 2 таких метода:

func rxGetAllTonicsForLanguage(language: Language) -> Observable<AnyObject?>
func saveTonics(list: [Tonic]) -> Observable<AnyObject?>

Теперь я хочу сначала выполнить вызов getAllTonics, а затем с результатом этого вызова выполнить следующее действие. Поэтому я подумал, что это то, что я могу сделать с FlatMap. Но я застрял, я не могу понять, как связать их.

Я пробовал следующее:

   self.remoteService.rxGetAllTonicsForLanguage(language)
        .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
        .flatMap{tonics -> Observable<[Tonic]> in
            print("Tonics: \(tonics)")
            let x = tonics as! [Tonic]
            return TonicAdapter.sharedInstance.saveTonics(x)
    }.observeOn(MainScheduler.instance)
        .subscribe({ e in
            switch e {
            case .Next(let element):
                if let result = element as? String {
                    DDLogDebug("Saved something \(result)")
                }
            case .Error(let e):
                DDLogError("Error in save tonics \(e)")
            case .Completed:
                DDLogDebug("Completed save tonics")
            }
            }
        ).addDisposableTo(self.disposeBag)

Это дает мне эту ошибку в строке возврата TonicAdapter:

Cannot convert return expression of type 'Observable<AnyObject?>' (aka 'Observable<Optional<AnyObject>>') to return type 'Observable<[Tonic]>' (aka 'Observable<Array<Tonic>>')

Я не вижу проблемы, потому что оба метода возвращают Observables?


person user1007522    schedule 07.07.2016    source источник
comment
Вам необходимо изменить тип возвращаемого значения, объявленный в saveTonics, с Observable<AnyObject?> на Observable<[Tonic]>. Или вы можете применить то же изменение (если вы уверены, что так будет всегда).   -  person Putz1103    schedule 07.07.2016
comment
Большое спасибо. Я настолько увлекся кодом, что не заметил, что написал его по-другому :-).   -  person user1007522    schedule 08.07.2016


Ответы (2)


Вам необходимо изменить тип возвращаемого значения, объявленный в saveTonics, с Observable на Observable ‹[Tonic]>. Или вы можете применить то же изменение (если вы уверены, что так будет всегда).

person Putz1103    schedule 08.07.2016

func rxGetAllTonicsForLanguage(language: Language) -> Observable<[Tonic]>
func saveTonics(list: [Tonic]) -> Observable<AnyObject?>

вывод rxGetAllTonicsForLanguage можно передать saveTonics следующим образом

rxGetAllTonicsForLanguage
    .flatMapLatest(saveTonics)
    .subscribe(...)
    .disposed(by: disposeBag)
person Samuel    schedule 04.05.2018