Single

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

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

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

如何创建 Single

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

1. func getRepo(_ repo: String) -> Single<[String: Any]> {

3. return Single<[String: Any]>.create { single in
4. let url = URL(string: "https://api.github.com/repos/\(repo)")!
5. let task = URLSession.shared.dataTask(with: url) {
6. data, _, error in

8. if let error = error {
9. single(.error(error))
10. return
11. }

13. guard let data = data,
14. let json = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves),
15. let result = json as? [String: Any] else {
16. single(.error(DataError.cantParseJSON))
17. return
18. }

20. single(.success(result))
21. }

23. task.resume()

25. return Disposables.create { task.cancel() }
26. }
27. }

之后,你可以这样使用 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。