Return 无需使用创建块即可在 RxSwift 中完成

Return a completable in RxSwift without using a create block

我有一个由简单函数 return 编辑的 Completable。 这不是一个异步调用,所以我只需要 return 一个成功的完成或错误,这取决于条件(在这里使用 Rx,所以我可以结合其他 Rx 用法):

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

错误案例很容易解决,但我对如何 return 成功完成(而不需要 .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)
    }
}

这是 empty/throw/never 运算符上的 documentation

我更倾向于做以下事情:

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

然后为了将其绑定到其他 Rx 代码中,我将使用 map,如:

myObservable.map { try example() }

但是,映射到 Completable 上不起作用,因为映射的闭包只会在下一个事件中被调用。 :-(

出于这个原因,我倾向于避免使用 Completable,它似乎不能很好地与其他可观察对象一起使用。我更喜欢使用 Observable<Void> 并在完成之前发送一个空事件...

像这样:

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