RAC
讓咱們的OC
開發過程變得更加的方便、快捷,更加的面向開發者,那麼做爲蘋果主推的swift
,是否也有如此便捷的第三方框架呢?答案固然是確定的,RxSwift
,知足了咱們的需求,下面咱們來初步體驗一下RxSwift
。編程
首先咱們有一個簡單的需求:監聽UITextField
的text
的變化。 常規的方法,咱們能想到不少,好比代理
、通知
。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
通知
,就從通知開始了//MARK: - 通知
func setupNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (noti) in
print(noti)
})
.disposed(by: disposeBag)
}
//節省篇幅,上面已經寫過通知的代碼,這裏就再也不重複的寫了
複製代碼
//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
;//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
咱們不用再去關心代理
了,也不用去糾結到底用哪一個代理方法了,一句代碼搞定。//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了
,機智//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
還有更多,更強大的功能,等着咱們去探索,咱們一塊兒去體驗萬物皆序列
,體會原來代碼也能夠寫的這麼簡潔的感受吧。函數