Observable.empty在zip中返回什么?

时间:2017-03-28 09:18:55

标签: ios swift rx-swift

如果函数返回一个Observable.empty(),那么在执行此值的Observable.zip后我会得到什么?问题是我总是想在Observable.zip中执行代码,因为source2()可能会失败,我会执行一个catchError,然后返回一个空的observable。但我不确定拉链是否仍会使用此方法调用该块。

 func source1() -> Observable<String> {
  return Observable.just("test")
}

func source2() -> Observable<Int> {
  return anObservableThatCanFail()
  .catchError { error -> Observable<Int> 
       return Observable.empty()
  }
}

func myFunc() {
    Observable.zip(source1(), source2()) { string, integer 
   //this will be called despite source2() do a empty()? 
   //and if so, what integer contains?
}

1 个答案:

答案 0 :(得分:4)

来自reactivex.io的文档:

  

它以严格的顺序应用此函数,因此新Observable发出的第一个项目将是应用于Observable#1发出的第一个项目和Observable#2发出的第一个项目的结果;新的zip-Observable发出的第二个项目是应用于Observable#1发出的第二个项目和Observable#2发出的第二个项目的结果;等等。它只会发出与发出最少项目的源Observable 发出的项目数一样多的项目。

所以在这个例子中,因为.empty()会发出0项,这意味着zip也会发出0项。

如果您确实需要执行压缩功能,可以将source2()的类型从Observable<Int>更改为Observable<Int?>,而不是从.empty()返回catchError {1}}阻止,返回.just(nil)

func source2() -> Observable<Int?> {
  return anObservableThatCanFail()
    .map { (result: Int) -> Int? in result }
    .catchError { error -> Observable<Int?> 
       return Observable.just(nil)
    }
}