RXSwift flatMap 两种方法

Posted

技术标签:

【中文标题】RXSwift flatMap 两种方法【英文标题】:RXSwift flatMap two methods 【发布时间】:2016-07-07 17:50:09 【问题描述】:

我有两种这样的方法:

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

现在我想先调用 getAllTonics,然后根据调用的结果我想做下一个动作。所以我认为这是我可以用 FlatMap 做的事情。但我被困住了,我不知道如何链接这些。

我尝试如下:

   self.remoteService.rxGetAllTonicsForLanguage(language)
        .subscribeOn(ConcurrentDispatchQueueScheduler(globalConcurrentQueueQOS: .Background))
        .flatMaptonics -> 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?

【问题讨论】:

您需要将saveTonics中声明的返回类型从Observable&lt;AnyObject?&gt;更改为Observable&lt;[Tonic]&gt;。或者,您可以进行相同的更改(如果您确定始终如此)。 非常感谢。我对代码非常感兴趣,以至于我没有看到我写的不同:-)。 【参考方案1】:

您需要将 saveTonics 中声明的返回类型从 Observable 更改为 Observable。或者,您可以进行相同的更改(如果您确定始终如此)。

【讨论】:

【参考方案2】:
func rxGetAllTonicsForLanguage(language: Language) -> Observable<[Tonic]>
func saveTonics(list: [Tonic]) -> Observable<AnyObject?>

rxGetAllTonicsForLanguage 的输出可以像这样传递给 saveTonics

rxGetAllTonicsForLanguage
    .flatMapLatest(saveTonics)
    .subscribe(...)
    .disposed(by: disposeBag)

【讨论】:

以上是关于RXSwift flatMap 两种方法的主要内容,如果未能解决你的问题,请参考以下文章

RxSwift:嵌套可观察对象上的 FlatMap

RxSwift flatMap 最新一次,无需处理

使用 if/else 语句返回 observable 不适用于 RxSwift flatMap

IOS RxSwift中UISearch栏文本和视图模型属性之间的两种方式绑定

RxSwift之深入解析dispose源码的实现

Android:rxjava简单实现原理(map/flatmap操作符)