在不使用创建块的情况下返回RxSwift中的完整代码

问题描述:

我有一个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似乎没有触发完成事件。

.empty()是我一直在寻找的运营商!

原来,我在头脑中混合了.never().empty()的实现!

  • .never()不排放项目和终止
  • .empty()不排放项目,但正常结束

所以,上面这个例子是这样的:

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

这里是documentation空/投掷/从不操作员。

我会更倾向于做到以下几点:

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