• RxSwift 核心


    RxSwift 核心

    image

    • Observable - 产生事件(可监听序列)
    • Observer - 响应事件(观察者)
    • Operator - 创建变化组合事件 (操作符)
    • Disposable - 管理绑定(订阅)的生命周期
    • Schedulers - 线程队列调配(调度器)
    // Observable<String>
    let text = usernameOutlet.rx.text.orEmpty.asObservable()
    
    // Observable<Bool>
    let passwordValid = text
        // Operator
        .map { $0.characters.count >= minimalUsernameLength }
    
    // Observer<Bool>
    let observer = passwordValidOutlet.rx.isHidden
    
    // Disposable
    let disposable = passwordValid
        // Scheduler 用于控制任务在那个线程队列运行
        .subscribeOn(MainScheduler.instance)
        .observeOn(MainScheduler.instance)
        .bind(to: observer)
    
    
    ...
    
    // 取消绑定,你可以在退出页面时取消绑定
    disposable.dispose()

    Observable - 可监听序列

    image

    • 所有的事物都是序列

    Observable 可以用于描述元素异步产生的序列。这样我们生活中许多事物都可以通过它来表示

    • Observable 温度

    可以将温度看作是一个序列,然后监测这个温度值,最后对这个值做出响应。例如:当室温高于 33 度时,打开空调降温。

    image

    • Observable 《海贼王》动漫

    也可以把《海贼王》的动漫看作是一个序列。然后当《海贼王》更新一集时,我们就立即观看这一集。

    image

    • Observable JSON

    可以把网络请求的返回的 JSON 看作是一个序列。然后当取到 JSON 时,将它打印出来。

    image

    • Observable 任务回调

    可以把任务回调看作是一个序列。当任务结束后,提示用户任务已完成。

    如何创建序列

    现在我们已经可以把生活中的许多事物看作是一个序列了。那么我们要怎么创建这些序列呢?

    实际上,框架已经帮我们创建好了许多常用的序列。例如:button的点击,textField的当前文本,switch的开关状态,slider的当前数值等等。

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

    image

    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 { (observer) -> Disposable in
    
        let task = URLSession.shared.dataTask(with: ...) { data, _, error in
    
            guard error == nil else {
                observer.onError(error!)
                return
            }
    
            guard let data = data,
                let jsonObject = try? JSONSerialization.jsonObject(with: data, options: .mutableLeaves)
                else {
                observer.onError(DataError.cantParseJSON)
                return
            }
    
            observer.onNext(jsonObject)
            observer.onCompleted()
        }
    
        task.resume()
    
        return Disposables.create { task.cancel() }
    }

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

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

    json
        .subscribe(onNext: { 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 - 事件

    public enum Event<Element> {
        case next(Element)
        case error(Swift.Error)
        case completed
    }
    • next - 序列产生了一个新的元素
    • error - 创建序列时产生了一个错误,导致序列终止
    • completed - 序列的所有元素都已经成功产生,整个序列已经完成

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

    特征序列

    Swift 是一个强类型语言,而强类型语言相对于弱类型语言的一个优点是更加严谨。我们可以通过类型来判断出,实例有哪些特征。同样的在 RxSwift 里面 Observable 也存在一些特征序列,这些特征序列可以帮助我们更准确的描述序列。并且它们还可以给我们提供语法糖,让我们能够用更加优雅的方式书写代码,他们分别是:

    • Single
    • Completable
    • Maybe
    • Driver
    • Signal
    • ControlEvent
  • 相关阅读:
    悟透JavaScript(理解js面向对象)(转)
    spark相关问题
    hive常见问题以及解析
    visual studio code添加leetcode插件
    阿里云oss的使用
    Poi工具类快速生成Ecxel(升级版)
    linux实现增量拷贝数据,代替scp
    nginx实现均衡负载
    idea 程序包不存在 解决办法
    通过word文件模板生成word文件
  • 原文地址:https://www.cnblogs.com/liuxiaokun/p/12680578.html
Copyright © 2020-2023  润新知