RxSwift(1)- 讓代碼變得更優雅

RAC讓咱們的OC開發過程變得更加的方便、快捷,更加的面向開發者,那麼做爲蘋果主推的swift,是否也有如此便捷的第三方框架呢?答案固然是確定的,RxSwift,知足了咱們的需求,下面咱們來初步體驗一下RxSwift編程

首先咱們有一個簡單的需求:監聽UITextFieldtext的變化。 常規的方法,咱們能想到不少,好比代理通知swift

  • 通知
override func viewDidLoad() {
    super.viewDidLoad()
    //添加通知
    NotificationCenter.default.addObserver(self, selector: #selector(textChange), name: UITextField.textDidChangeNotification, object: self.textField!)
}
    
@objc func textChange() {
     //實際開發中作具體操做
     print("\(textField.text!)")
}

deinit() {
     NotificationCenter.default.removeObserver(self)
}
複製代碼
  • 代理
class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var textField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()
       textField.delegate = self
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        //實際開發中作具體操做
        print("\(textField.text)")
        return true
    }
}
複製代碼

需求實現的過程仍是蠻簡單的,固然在實際開發中確定不會只有一個print操做了,常規方法解決了咱們的需求,那麼RxSwift是怎麼來解決咱們的需求的呢?bash

  • RxSwift監聽UITextField
func setupTextFiled() {
   self.textFiled.rx.text.orEmpty
     .subscribe(onNext: { (text) in
       //實際開發中作具體操做
       print(text)
     })
     .disposed(by: disposeBag)
}
複製代碼

咱們來對通知代理等常規方法與RxSwift進行比較: 1.通知須要咱們添加到通知中心,還得添加一個回調的方法textChange,來監聽text的變化; 2.代理須要遵照代理協議,實現代理方法,來監聽text的變化; 3.RxSwift 鏈式編程,直接對textField操做,更加的面向開發者。框架

固然這個簡單的需求不太能說明RxSwift的強大、便捷,只是一個簡單的體驗的開始,下面咱們對RxSwift進行更多的體驗,感覺一下,是否是真的很便捷:ide

1、通知

  • 既然在開篇講到了通知,就從通知開始了
//MARK: - 通知
func setupNotification(){
    NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
        .subscribe(onNext: { (noti) in
            print(noti)
        })
    .disposed(by: disposeBag)
}
//節省篇幅,上面已經寫過通知的代碼,這裏就再也不重複的寫了
複製代碼

2、button點擊

//MARK: - RxSwift應用-button響應
func setupButton() {
    self.button.rx.tap
        .subscribe(onNext: { () in
            print("別再點我了!!!")
        })
        .disposed(by: disposeBag)
}

//MARK: - button常規響應
func setupBtn() {
    btn.addTarget(self, action: #selector(btnDidClick(_:)), for: UIControl.Event.touchUpInside)
}

@objc func btnDidClick(_ sender: UIButton) {
    print("再點我,我跟你急!")
}
複製代碼
  • 不在須要咱們再去addTarget了,不再用怕忘了@objc;

3、UIScrollView

//MARK: - RxSwift應用-scrollView
func setupScrollerView() {
    scrollView.rx.contentOffset
        .subscribe(onNext: { [weak self](content) in
            self?.view.backgroundColor = UIColor.init(red: content.y / 255 * 0.7, green: content.y / 255 * 0.4, blue: content.y / 255 *0.1, alpha: 1.0)
        })
    .disposed(by: disposeBag)
}

//MARK: -scrollView 常規 
//設置代理
scrollView.delegate = self
//代理方法實現
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    print("\(scrollView.contentOffset)")
    let y = scrollView.contentOffset.y
    self.view.backgroundColor = UIColor(red: y / 255 * 0.7, green: y / 255 * 0.4, blue: y / 255 * 0.1, alpha: 1.0)
}
複製代碼
  • 用了RxSwift咱們不用再去關心代理了,也不用去糾結到底用哪一個代理方法了,一句代碼搞定。

4、手勢

//MARK: - 手勢 - 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)
}

//MARK: - 手勢 - 常規寫法
func setupGesture() {
    label.isUserInteractionEnabled = true
    let tapGesture = UITapGestureRecognizer(target: self, action: #selector(tap))
    label.addGestureRecognizer(tapGesture)
}

@objc func tap() {
    print("label能夠點擊了")
}
複製代碼
  • 尷尬了,好像這個沒能讓咱們感受到便捷的了,沒有什麼能夠說道的,那麼就強行製造一個,so easy, 媽媽不再用擔憂我會忘記@objc了機智

5、KVO

//MARK: - RxSwift應用-KVO
func setupKVO() {
    self.person.rx.observeWeakly(String.self, "name")
        .subscribe(onNext: { (value) in
            print(value as Any)
        })
        .disposed(by: disposeBag)
}

//MARK: -KVO 常規寫法
//添加觀察者
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![NSKeyValueChangeKey.newKey])!)")
}
deinit {
    //移除觀察者
    person.removeObserver(self, forKeyPath: "name")
}
複製代碼
  • 糟了,RxSwift沒有移除觀察者的操做,會釋放不了的吧?不存在;移除須要咱們關心嗎?不須要;KVO三部曲是什麼?浮雲也。

寫到最後,這些只是一些簡單swift的常規寫法和RxSwift寫法的對比體驗,RxSwift給咱們的感受就是 . 函數,點着點着,咱們的需求也完成了,button再不須要咱們寫着寫着,就要跳出來給addTarget添加一個方法;再也不須要設置代理、再也不須要關心通知KVO是否在deinit釋放.....RxSwift還有更多,更強大的功能,等着咱們去探索,咱們一塊兒去體驗萬物皆序列,體會原來代碼也能夠寫的這麼簡潔的感受吧。函數

相關文章
相關標籤/搜索