• 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中文网

  • 相关阅读:
    杭电2060WA
    杭电2060
    UVa10082 没有通过
    百度笔试题目02
    百度笔试题目01
    Q1002 四则运算
    百度笔试题目
    约瑟夫环 详细的分析
    算法导论03
    汉诺塔01
  • 原文地址:https://www.cnblogs.com/muzichenyu/p/14838882.html
Copyright © 2020-2023  润新知