Completable

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。

posted on 2020-04-11 21:03  码上翻身  阅读(514)  评论(0编辑  收藏  举报

导航