在不使用创建块的情况下返回RxSwift中的可填写表

时间:2017-07-14 23:40:59

标签: ios swift rx-swift

我从一个简单的函数返回一个Completable。 这不是异步调用,所以我只需要根据条件返回一个成功的完成或错误(在这里使用Rx,这样我可以绑定到其他Rx用法):

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

错误案例非常容易,但是我对如何返回成功的完成表(不需要.create()它)有一个阻止。

我在想我只需要使用Completable' .just().never(),但just需要参数,而never不需要似乎触发了完成事件。

2 个答案:

答案 0 :(得分:11)

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

事实证明,我把.never().empty()的实现混淆了!

  • .never()不会发出任何内容,不会终止
  • .empty()不会发出任何内容,但正常终止

因此,上面的示例代码的工作原理如下:

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

这是空/ throw / never运算符的documentation

答案 1 :(得分: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) }