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) }
我有一个由简单函数 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) }