2017-07-14 74 views
2

我有一個Completable從簡單函數返回。 這不是一個異步調用,所以我只需要返回根據條件一succcessful完成或錯誤(這裏使用的Rx這樣我就可以綁定到其他的Rx用途):在不使用創建塊的情況下返回RxSwift中的完整代碼

func exampleFunc() -> Completable { 
    if successful { 
     return Completable.just() // What to do here??? 
    } else { 
     return Completable.error(SomeErrorType.someError) 
    } 
} 

錯誤的情況下工作很容易,但是在如何返回一個成功的可完成的(不需要.create()它)方面存在阻塞。

我想我只需要使用Completable的.just().never(),但just是需要一個參數,並never似乎沒有觸發完成事件。

回答

3

.empty()是我一直在尋找的運營商!

原來,我在頭腦中混合了.never().empty()的實現!

  • .never()不排放項目和終止
  • .empty()不排放項目,但正常結束

所以,上面這個例子是這樣的:

func exampleFunc() -> Completable { 
    if successful { 
     return Completable.empty() 
    } else { 
     return Completable.error(SomeErrorType.someError) 
    } 
} 

這裏是documentation空/投擲/從不操作員。

0

我會更傾向於做到以下幾點:

func example() throws { 
    // do something 
    if !successful { 
     throw SomeErrorType.someError 
    } 
} 

然後以將其綁定到其他的Rx碼,我只想用map爲:

myObservable.map { try example() } 

但隨後,在Completable上映射不起作用,因爲只有在下一個事件中才會調用map的閉包。 :-(

我傾向於避免Completable因爲這個原因,它似乎並沒有與其他觀測中發揮很好,我喜歡使用Observable<Void>和完成之前發送一個空的事件...

東西像這樣:

let chain = Observable<Void>.just() 
let foo = chain.map { try example() } 
foo.subscribe { event in print(event) } 
+0

好點,我想偶爾使用特點,所以我瞭解他們的使用情況和侷限性更好 - 預告CONCAT和合並運營商已經加入到Completable在[V3.5.0](HTTPS:// github.com/ReactiveX/RxSwift/blob/master/CHANGELOG.md),希望隨着更多操作員的加入,他們更容易與其他流程集成! – Yasir

相關問題