美文网首页Swift
Swift Day 22 响应式编程(Reactive Prog

Swift Day 22 响应式编程(Reactive Prog

作者: 望穿秋水小作坊 | 来源:发表于2020-12-27 22:14 被阅读0次
    1. 什么是响应式编程?比较著名的两个框架是哪两个?
    • 响应式编程(Reactive Programming,简称 RP)
    • 也是一种编程范式,于 1997 年提出,可以简化异步编程,提供更优雅的数据绑定
    • 一般与函数式融合在一起,所以也会叫做:函数响应式编程(Functional Reactive Programming,简称 FRP)
    2. RxSwift 的基本介绍
    image.png
    // 本次 RxSwift 版本环境
    RxSwift (5.0.0)
    RxCocoa (5.0.0)
    
    3. RxSwift 的三个核心概念是什么?分别做什么?
    • Observable:负责发送事件(Event)
    • Observer:负责订阅 Observable,监听 Observable 发送的事件(Event)
    • Event:负责 ObservableObserver 的沟通,有三种状态 next、error、completed
    image.png
    4. 最基础用法:创建事件发送者、创建事件订阅者、发送事件
    // ①创建observable,在内部发布事件
    let observable = Observable<Int>.create {
        (observer) -> Disposable in
        // ②发送事件
        observer.onNext(11)
        observer.onNext(22)
        observer.onCompleted()
        return Disposables.create()
    }
    
    // ③subscible() 内部会创建Observer 并监听 observable
    observable.subscribe(onNext: { (value) in
        print(value);
    }, onError: { (error) in
        print(error)
    }, onCompleted: {
        print("onCompleted")
    })
    
    5. 几种快速创建 Observable 并且发送事件的方式
    // ①通过数组创建,数组每个元素触发一次 onNext
    let observable1 = Observable.from([1,2,3])
    // ②发送一次事件
    let observable2 = Observable.just(1)
    // ③通过可变参数创建
    let observable3 = Observable.of(1,2,3)
    
    6. 创建带延迟和定时器的 Observable,并将结果设置给 Label 控件
    let observable = Observable<Int>.timer(.seconds(2),
                                                   period: .seconds(1),
                                                   scheduler: MainScheduler.instance)
            // countLabel.rx.text 就是 Binder 也就是 Observer
            observable.map { "数值是:\($0)" }.bind(to: countLabel.rx.text)
    
    7. Disposable 对象用于控制订阅者的生命周期,有常见的三种方式释放订阅,哪三种?
    image.png
    8. 创建自己初始化的 Observer 实例的两种方式?(AnyObserver、Binder)
    // ①通过 AnyObserver 创建自定义 Observer
    let observer = AnyObserver<Int>.init { event in
        switch event {
        case .next(let data):
            print(data)
        case .error(let error):
            print(error)
        case .completed:
            print("completed")
        }
    }
    Observable.just(1).subscribe(observer).dispose()
    
    // ①通过 Binder 创建自定义 Observer
    let binder = Binder<Int>.init(countLabel) { (label, value) in
        label.text = "数值:\(value)"
    }
    Observable.just(1).subscribe(binder).dispose()
    
    9. 让 UILabel 每隔一秒切换隐藏展示,体会 Binder 的用处
    // ①通过 Binder 创建自定义 Observer
    let binder = Binder<Bool>.init(countLabel) {
        (label, value) in
        label.isHidden = value
    }
    // ②创建定时发送的 Observable
    let observable = Observable<Int>.timer(.seconds(3), period: .seconds(1), scheduler: MainScheduler.instance)
    // ③Observer 订阅 Observable
    observable.map( {$0 % 2 == 0} ).bind(to: binder).disposed(by: bag)
    
    • 其实 Binder 就是能让我们拿到操作对象(UILabel)的 Observer
    10. 传统的状态监听方式有哪些(五种)?有什么弊端?(重要)
    • 在开发中经常要对各种状态进行监听,传统的常见监听方案有:
    • KVO
    • Target-Action
    • Notification
    • Delegate
    • Block Callback
    • 弊端:传统方案经常会出现错综复杂的依赖关系、耦合性比较高,还需要编写重复的非业务代码
    11. 监听按钮点击
    button.rx.tap.subscribe { (evet) in
        print("按钮被点击了",evet)
    }.disposed(by: bag)
    
    12. RxSwift 中的 TableView
    let data = Observable.just([
        Person(name: "Jack", age: 10),
        Person(name: "Rose", age: 20)
    ])
    
    data.bind(to: tableView.rx.items(cellIdentifier: "cell")){
        row, person, cell in
        cell.textLabel?.text = person.name
        cell.detailTextLabel?.text = "\(person.age)"
    }.disposed(by: bag)
    
    tableView.rx.modelSelected(Person.self)
        .subscribe(onNext: { print("点击了", $0.name)})
        .disposed(by: bag)
    
    13. Notification 监听
    image.png

    相关文章

      网友评论

        本文标题:Swift Day 22 响应式编程(Reactive Prog

        本文链接:https://www.haomeiwen.com/subject/mkqanktx.html