二十四、响应式编程

import UIKit
import RxSwift
import RxCocoa

//7.拓展Binder属性
extension Reactive where Base: UIView {
    var hidden: Binder<Bool> {
        return Binder<Bool>(base) { button, value in
            button.isHidden = value
        }
    }
    
}

class Person {
    var name: String
    var age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}

class ViewController: UIViewController {

    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var button: UIButton!
    
    @IBOutlet weak var textField: UITextField!
    
    @IBOutlet weak var slider: UISlider!
    @IBOutlet weak var tableView: UITableView!
    let bag = DisposeBag()
    let persons = Observable.just([
        Person(name: "Jack", age: 20),
        Person(name: "Rose", age: 25),
        Person(name: "Kate", age: 30)
    ])
    
    override func viewDidLoad() {
        super.viewDidLoad()
        /*
         1.响应式编程
         a.响应式编程RP Reactive Programming,也是一种编程范式,于1997年提出,可以简化异步编程,提供更优雅的数据绑定,一般与函数式融合在一起,所以也会叫做函数响应式编程Functional Reactive Programming简称FRP。
         b.比较著名的、成熟的响应式框架
         ReactiveCocoa,简称RAC,有OC、swift版本。
         c.ReactiveX简称Rx,有众多编程语言的版本,比如RXJava、RXKotlin、RXJS、RxCpp、RxPHP、RxGo、RxSwift等等
         
         2.RXSwift
         a.RxSwift(ReactiveX for Swift),ReactiveX的Swift版本。
         //中文文档:https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
         b.RxSwift的GitHub已经有详细的安装过程,这里只演示CocoaPods方式的安装
         (1)Podfile
         target 'RXSwiftTest' do
           pod 'RxSwift','~>5'
           pod 'RxCocoa','~>5'
         end
         c.模块说明
         RxSwift:Rx标准API的swift实现,不包括任何iOS相关的内容。
         RxCocoa:基于RxSwift,给iOSUI控件拓展了很多Rx特性.
         
         3.RxSwift的核心角色
         Observable:负责发送事件Event。
         Observer:负责订阅Observable,监听Observable发送的事件Event
         public enum Event<Element> { //3种Event
             /// Next element is produced.
             case next(Element) //携带具体数据

             /// Sequence terminated with an error.
             case error(Swift.Error) //携带错误信息,表明Observable终止,不会再发出事件

             /// Sequence completed successfully.
             case completed //表明Observable终止,不会再发出事件
         }
         */
        //4.创建、订阅Observable1
        func test1() {
            var observable = Observable<Int>.create { observer in
                observer.onNext(1)
                observer.onCompleted()
                return Disposables.create()
            }
            //等价于
            observable = Observable.just(1)
            observable = Observable.of(2)
            observable = Observable.from([3])
            _ = observable.subscribe {
                print("next", $0)
            } onError: {
                print("error", $0)
            } onCompleted: {
                print("onCompleted")
            } onDisposed: {
                print("Disposed")
            }.disposed(by: bag) //当bag销毁deinit时,会自动调用Disposable实例的dispose,VC销毁时bag才销毁
//            disposable.dispose() 可以在touchbegan取消掉
            /*
             next 3
             onCompleted
             Disposed
             */
        }
        test1()
        func test2() {
            var observable = Observable<Int>.create { observer in
                observer.onNext(1)
                observer.onNext(2)
                observer.onNext(3)
                observer.onCompleted()
                return Disposables.create()
            }
            //等价于
            observable = Observable.of(1, 2, 3)
            observable = Observable.from([1, 2, 3])
            //observable.takeUntil(self.rx.deallocated).subscribe self销毁(deinit)时,会自动调用Disposable实例的dispose
            observable.subscribe { event in
                print(event)
            }.dispose() //立即取消订阅,只订阅一次
            /*
             next(1)
             next(2)
             next(3)
             completed
             */
        }
        test2()
        
        //5.创建、订阅Observable2
        func test3() {
            let observable = Observable<Int>.timer(.seconds(2), period: .seconds(1), scheduler: MainScheduler.instance)
//            observable.map { "数值是:\($0)" }.bind(to:label.rx.text)
            let binder = Binder<Bool>(button) {
                button, value in
                button.isHidden = value
            }
            
            observable.map { $0 % 2 == 0 }.bind(to: binder).disposed(by: bag)
            //等价 自己扩充的 //7.拓展Binder属性
            observable.map { $0 % 2 == 0 }.bind(to: button.rx.hidden).disposed(by: bag)
            //等价 系统的
            observable.map { $0 % 2 == 0 }.bind(to: button.rx.isHidden).disposed(by: bag)
        }
        test3()
        
        //6.创建Observer
        func test4() {
            let observer = AnyObserver<Int>.init { event in
                switch event {
                case .next(let data):
                    print(data)
                case .completed:
                    print("completed")
                case .error(let error):
                    print("error",error)
                }
            }
            Observable.just(1).subscribe(observer).dispose()
            
            let binder = Binder<String>(label) { label, text in
                label.text = text
            }
            Observable.just(4).map {"数值是\($0)"}.subscribe(binder).dispose()
            Observable.just(5).map {"数值是\($0)"}.bind(to: binder).dispose()
        }
        test4()
        
        //8.传统的状态监听
        /*
         在开发中经常要对各种状态进行监听,传统的常见监听方案有KVO、Target-Action、Notification、Delegate、Block Callback,传统方案经常会出现错综复杂的依赖关系、耦合性较高,还需要编写重复的非业务代码
         */
        
        //9.RxSwift的状态监听1 Target-Action
        button.rx.tap.subscribe(onNext: {
            print("按钮被点击了")
        }).disposed(by: bag)
        
        //绑定tableView
        persons.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:{ person in
            print("点击了", person.name)
        }).disposed(by: bag)
        
        //10.RxSwift的状态监听2 KVO
        class Dog: NSObject {
            @objc dynamic var name: String?
        }
        var dog = Dog()
        dog.rx.observe(String.self, "name").subscribe(onNext: { name in
            print("name is", name ?? "nil")
        }).disposed(by: bag)
        dog.name = "rose"
        dog.name = "dddddd"
        
        //Notification
        NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification).subscribe(onNext: {
            notification in
            print("APP 进入后台",notification)
        }).disposed(by: bag)
        
        //11.既是Observable又是Observer:诸如UISlider.rx.value、UITextField.rx.text,它们是RxCocoa.ControlProperty类型
        Observable.just(0.8).bind(to: slider.rx.value).disposed(by: bag)
        slider.rx.value.map { "当前数值是:\($0)" }.bind(to: textField.rx.text).disposed(by: bag)
//        textField.rx.text.subscribe(onNext:{ text in
//            print("text is", text ?? "nil")
//        }).disposed(by: bag)
        
        
        //12.Disposable 上面有3个
        
    }
   

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值