• Single
    • 如何创建 Single

    Single

    SingleObservable 的另外一个版本。不像 Observable 可以发出多个元素,它要么只能发出一个元素,要么产生一个 error 事件。

    • 发出一个元素,或一个 error 事件
    • 不会共享状态变化

    一个比较常见的例子就是执行 HTTP 请求,然后返回一个应答错误。不过你也可以用 Single 来描述任何只有一个元素的序列。

    如何创建 Single

    创建 Single 和创建 Observable 非常相似:

    1. func getRepo(_ repo: String) -> Single<[String: Any]> {
    2. return Single<[String: Any]>.create { single in
    3. let url = URL(string: "https://api.github.com/repos/\(repo)")!
    4. let task = URLSession.shared.dataTask(with: url) {
    5. data, _, error in
    6. if let error = error {
    7. single(.error(error))
    8. return
    9. }
    10. guard let data = data,
    11. let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
    12. let result = json as? [String: Any] else {
    13. single(.error(DataError.cantParseJSON))
    14. return
    15. }
    16. single(.success(result))
    17. }
    18. task.resume()
    19. return Disposables.create { task.cancel() }
    20. }
    21. }

    之后,你可以这样使用 Single

    1. getRepo("ReactiveX/RxSwift")
    2. .subscribe(onSuccess: { json in
    3. print("JSON: ", json)
    4. }, onError: { error in
    5. print("Error: ", error)
    6. })
    7. .disposed(by: disposeBag)

    订阅提供一个 SingleEvent 的枚举:

    1. public enum SingleEvent<Element> {
    2. case success(Element)
    3. case error(Swift.Error)
    4. }
    • success - 产生一个单独的元素
    • error - 产生一个错误

    你同样可以对 Observable 调用 .asSingle() 方法,将它转换为 Single