美文网首页
RxSwift的初体验

RxSwift的初体验

作者: king_jensen | 来源:发表于2019-07-26 12:01 被阅读0次

RxSwift是一种函数式响应编程的框架。RxSwift遵循Functional Reactive Programming(FRP)的设计规范,其目的是通过类似于信号流或者观察者的方式来实现代码的逻辑运算,使代码更加的简洁、明了。
关于RxSwift的环境搭建非常简单,这里就不在详细赘述。

KVO实现

传统方法实现:
1.添加监听addObserver

func setupKVO() {
        self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
}

2.实现observeValue方法

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

3.移除监听

 deinit {
        self.removeObserver(self.person, forKeyPath: "name", context: nil)
    }

RxSwift实现:

func setupKVO() {
        self.person.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (value) in
                print(value as Any)
            })
            .disposed(by: disposeBag)
    }

大家感受到RxSwift的魅力了吗?接下来我们继续体验其他的应用。

RxSwift应用-button响应

   func setupButton() {
        // 业务逻辑 和 功能逻辑
        // 设计
        self.button.rx.tap
            .subscribe(onNext: { () in
                print("点击来了")
            })
            .disposed(by: disposeBag)
    }

RxSwift应用-textfiled

    func setupTextFiled() {
        self.textFiled.rx.text.orEmpty
            .subscribe(onNext: { (text) in
               print(text)
            })
            .disposed(by: disposeBag)
        self.textFiled.rx.text
            .bind(to: self.button.rx.title())
            .disposed(by: disposeBag)
    }

RxSwift应用-scrollView

 func setupScrollerView() {
    
        scrollView.rx.contentOffset
            .subscribe(onNext: { [weak self](content) in
                self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)
            })
        .disposed(by: disposeBag)
    }

RxSwift应用-手势

 func setupGestureRecognizer(){
        let tap = UITapGestureRecognizer()
        self.label.addGestureRecognizer(tap)
        self.label.isUserInteractionEnabled = true
        tap.rx.event.subscribe(onNext: { (tap) in
            print(tap.view)
        })
        .disposed(by: disposeBag)
    }

RxSwift应用-通知

 func setupNotification(){
        NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
            .subscribe(onNext: { (noti) in
                print(noti)
            })
        .disposed(by: disposeBag)
        
    }

RxSwift应用-timer定时器

func setupTimer() {
        // 核心逻辑
        // 1 发送一个响应
        timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        timer.subscribe(onNext: { (num) in
            print(num)
        })
        .disposed(by: disposeBag)
    }

RxSwift应用-网络请求

func setupNextwork() {
        let url = URL(string: "https://www.baidu.com")        
      URLSession.shared.rx.response(request: URLRequest(url: url!))
        .subscribe(onNext: { (response,data) in
            print(response)
        }).disposed(by: disposeBag)
        
    }

RxSwift案例实现

需求:
1.当用户输入用户名时,如果用户名不足 5个字就给出红色提示语,并且无法输入密码,当用户名符合要求时才可以输入密码。
2.同样的当用户输入的密码不到 5 个字时也给出红色提示语。 当用户名和密码有一个不符合要求时底部的绿色按钮不可点击,只有当用户名和密码同时有效时按钮才可点击。
3.当点击绿色按钮后弹出一个提示框,这个提示框只是用来做演示而已。

核心代码:

   let usernameVaild = usernameTextFiled.rx.text.orEmpty
            .map { (text) -> Bool in
                return text.count >= minUsernameLength
        }
        // 绑定到我们验证显示
        usernameVaild.bind(to: usernameValidLabel.rx.isHidden)
            .disposed(by: disposeBag)
        usernameVaild.bind(to: passwordTextFiled.rx.isEnabled)
            .disposed(by: disposeBag)
        
        let passwordVaild = passwordTextFiled.rx.text.orEmpty
            .map { (text) -> Bool in
                return text.count >= minPasswordLength
        }
        passwordVaild.bind(to: passwordValidLabel.rx.isHidden)
            .disposed(by: disposeBag)

        // 决定按钮 - button.rx.isenable
        Observable.combineLatest(usernameVaild,passwordVaild) { $0 && $1}
            .bind(to: loginBtn.rx.isEnabled)
            .disposed(by: disposeBag)

        loginBtn.rx.tap.subscribe(onNext: { () in
            print("dianji")
        }).disposed(by: disposeBag)

案例演示:

video.gif

相关文章

网友评论

      本文标题:RxSwift的初体验

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