Completable
Completable 是 Observable 的特殊版本 不像 Observable 可以发出多个元素,它要么只能产生一个 completed 事件,要么产生一个 error 事件。
- 发出零个元素
- 发出一个 completed 事件或者一个 error 事件
- 不会共享附加作用
Completable 适用于那种只关心任务是否完成,而不需要在意任务返回值的情况。它和 Observable 有点相似。
- 如何创建 Completable
创建 Completable 和创建 Observable 非常相似:
func cacheLocally() -> Completable {
return Completable.create { completable in
// Store some data locally
...
...
guard success else {
completable(.error(CacheError.failedCaching))
return Disposables.create {}
}
completable(.completed)
return Disposables.create {}
}
}
可以这样使用 Completable:
cacheLocally()
.subscribe(onCompleted: {
print("Completed with no error")
}, onError: { error in
print("Completed with an error: (error.localizedDescription)")
})
.disposed(by: disposeBag)
也可以使用这样调用
以使用如下方式使用这个 Completable:
cacheLocally()
.subscribe { completable in
switch completable {
case .completed:
print("保存成功!")
case .error(let error):
print("保存失败: (error.localizedDescription)")
}
}
.disposed(by: disposeBag)
订阅提供一个 CompletableEvent 的枚举:
public enum CompletableEvent {
case error(Swift.Error)
case completed
}
- completed - 产生完成事件
- error - 产生一个错误
Maybe
Maybe 是 Observable 的特殊版本。它介于 Single 和 Completable 之间,它要么只能发出一个元素,要么产生一个 completed 事件,要么产生一个 error 事件
- 发出一个元素或者一个 completed 事件或者一个 error 事件
- 不会共享附加作用
如果遇到那种可能需要发出一个元素,又可能不需要发出时,就可以使用 Maybe。
- 如何创建 Maybe 创建 Maybe 和创建 Observable 非常相似:
func generateString() -> Maybe<String> {
return Maybe<String>.create { maybe in
maybe(.success("RxSwift"))
// OR
maybe(.completed)
// OR
maybe(.error(error))
return Disposables.create {}
}
}
可以这样使用 Maybe:
generateString()
.subscribe(onSuccess: { element in
print("Completed with element (element)")
}, onError: { error in
print("Completed with an error (error.localizedDescription)")
}, onCompleted: {
print("Completed with no element")
})
.disposed(by: disposeBag)
同样可以对 Observable 调用 .asMaybe() 方法,将它转换为 Maybe。