RXSwift之ObServable

RXSwift之ObServable

Observable-可监听序列

Observable可以用来描述元素异步产生的序列。对于Observable而言,所有的事物都是序列。

  • Observable 温度
    你可以将温度看作是一个序列,然后监测这个温度值,最后对这个值做出响应。
  • Observable 《海贼王》动漫
    你也可以把《海贼王》的动漫看作是一个序列。
  • Observable JSON 你可以把网络请求的返回的JSON看作是一个序列。然后当取到JSON时,将它打印出来。
  • Observable 任务回调 你可以把任务回调看作是一个序列。当任务结束后,提示用户任务已完成。

如何创建序列

如果我们已经可以把生活中的许多事物看作是一个序列了。那么我们要怎么创建这些序列呢? 实际上,框架已经帮我们创建好了许多常用的序列。例如:button的点击、textField的当前文本、switch的开关状态、slider的当前数值等等。

另外,有一些自定义的序列是需要我们自己创建的。这里介绍一下创建序列最基本的方法,例如,我们创建一个 [0, 1, ... 8, 9]的序列

let numbers: Observable<Int> = Observable.create { (observer) -> Disposable in
            observer.onNext(0)
            observer.onNext(1)
            observer.onNext(2)
            observer.onNext(3)
            observer.onNext(4)
            observer.onNext(5)
            observer.onNext(6)
            observer.onNext(7)
            observer.onNext(8)
            observer.onNext(9)
            observer.onCompleted()
            return Disposables.create()
 }

创建序列最直接的方法就是调用 Observable.create,然后再构建函数里面描述元素的产生过程。observer.onNext(0) 就代表产生了一个元素,他的值是0,后面又产生了9个元素分别是 1,2,... 8,9.最后,用 observer.onCompleted() 表示元素已经全部产生,没有更多元素了。你可以用这种方式来封装功能组件

typealias JSON = Any
        let json: Observable<JSON> = Observable.create { (observe) -> Disposable in
            let task = URLSession.shared.dataTask(with: URLRequest(url: URL(string: "https://www.baidu.com")! )) { (data, _, error) in
                guard error == nil else {
                    observe.onError(error!)
                    return
                }
                
                guard let data = data, let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves) else {
                    return
                }
            }
            task.resume()
            return Disposables.create {
                task.cancel()
            }
        }

在闭包回调中,如果任务失败,就调用observer.onError(error!)。如果获取到目标元素,就调用observer.onNext(jsonObject),由于我们的这个序列只有一个元素,所以在成功获取元素后,就直接调用observer.onCompleted() 来表示任务结束。最后 Disposables.create { task.cancel() } 说明如果数据绑定被清除(订阅被取消)的话,就取消网络请求。

这样一来我们就将传统的闭包回调转换成序列了,然后可以用 subscribe 方法来响应这个请求的结果:

json.subscribe { (json) in
            print("取得 json 成功:(json)")
        } onError: { (error) in
            print("取得 json 失败 Error: (error.localizedDescription)")
        } onCompleted: {
            print("取得 json 任务成功")
        }.disposed(by: disposeBag)

这里 subscribe 后面的 onNext、onError、onCompleted 分别响应我们创建json时,构建函数里面的 onNext、onError、onCompleted事件。我们称这些事件为 Event:

Event - 事件

  • next - 序列产生了一个新的元素
  • error - 创建序列时产生了一个错误,导致序列终止
  • completed - 序列的所有元素都已经成功产生,整个序列已经完成

你可以合理的利用这些 Event 来实现业务逻辑。

决策树

现在我们知道如何用最基本的方法创建序列。你还可以参考决策树来选择其他的方式创建序列。

参考网址: RXSwift中文网

原文地址:https://www.cnblogs.com/muzichenyu/p/14838882.html