RxSwift 与KVO,及RX的简单应用

271 阅读2分钟

我正在参加「掘金·启航计划」

简介

  • swift------>属于 静态语言

  • OC ------>属于 动态语言

  • RXSwift框架使用函数响应式编程思想,弥补Swift静态语言的不灵活性,使用简单,代码清晰

  • RX 即 ReactiveX--->跨平台框架,

  • RXJs

  • RXJava

  • RXPhyson 等

那么什么是函数响应式编程? 函数可作为 输入的参数 或者返回值

KVO在Swift里使用三步曲:

  1. 订阅
  2. 响应
  3. 移除
//订阅
    func setKVOtest(){
        self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
    }
//响应

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        print(change as  Any)
    } 
    //移除
    deinit
    {
        self.removeObserver(self.person, forKeyPath: "name")
    }

注意:

  • 被观察的属性需要用 @objc dynamic 修饰,原因是Swift里面KVO 底层使用的还是OC里面的运行时,需要动态实现

RXSwift 将订阅,响应和销毁集中处理更清晰,简洁

RXSwift三步曲:

  1. 创建序列
  2. 订阅
  3. 销毁

//UIButton  点击事件
    func setbuttonTest()
    {
        self.rxButton.rx.tap
            .subscribe { _ in
                print("button 来了")
            }
            .disposed(by: disposeBag)
    }
//UItextField  输入 *.text.orEmpty.changed*
    func setTextFieldtest(){
        rxtextField.rx.text.orEmpty.changed
            .subscribe { text in
                print("输入的内容\(text)")
            }
            .disposed(by: disposeBag)
    }
    
//UITapGestureRecognizer
    func settapGesture(){
        let tapGesture = UITapGestureRecognizer()
        self.rxlable.addGestureRecognizer(tapGesture)
        self.rxlable.isUserInteractionEnabled = true
        tapGesture.rx.event.subscribe { _ in
            print("点击了label")
        }
        .disposed(by: disposeBag)
    }
    
    //UItextField  输入 关联显示在rxButton
    func setTextFieldtest2(){
        rxtextField.rx.text.bind(to: self.rxButton.rx.title())
            .disposed(by: disposeBag)
    }
//通知
    func setNOtificationTest()  {
    NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
            .subscribe { noti in

                print("键盘弹出来了---\(noti)")

            } .disposed(by: disposebag)
    }
    //timer 单次延时和 循环
func setReapetTest()
    {
        //有period,,循环执行;没period  延时1秒执行一次
//        timer = Observable<Int>.timer(.seconds(1), period: .seconds(2),scheduler: MainScheduler.instance)
        timer = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)
        timer.subscribe { value in
            print("打印\(value)")
        }
        .disposed(by: disposebag)
    }
    //点击按钮,停止循环timer,销毁timer
    func setbutoontest(){
        self.rxButton.rx.tap.subscribe{
           [weak self] value in
            print("buttonClicked\(value)")
            print("销毁垃圾袋,销毁timer")
            self?.disposebag = DisposeBag()
        }
        .disposed(by: disposebag)
    }
//网络的使用
    func setTestNetWork()
    {
        URLSession.shared.rx.response(request: URLRequest.init(url: URL.init(string:"http://www.baidu.xxx")!))
            .subscribe { response, data in
            } onError: { error in
                print("________错误____\(error)")
            }
    }
相比OC、swift原生实现的写法的写法更清晰、集中、易于阅读

ReactiveCompatible协议

  • 协议内容:设置了关联属性rx
  • NSObject 对象遵循了协议即可点出来rx