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<AnyObject?>
更改为Observable<[Tonic]>
。或者,您可以进行相同的更改(如果您确定始终如此)。
非常感谢。我对代码非常感兴趣,以至于我没有看到我写的不同:-)。
【参考方案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 两种方法的主要内容,如果未能解决你的问题,请参考以下文章
使用 if/else 语句返回 observable 不适用于 RxSwift flatMap