RxSwift 中監聽物件屬性改變的方式小結:rx_observe, PublishSubject 和 Variable
阿新 • • 發佈:2018-12-24
日常開發中,我們經常都要去觀察一個物件屬性的改變,那麼我們怎麼去監聽它比較好呢?
我們的選擇還是蠻多的,不過這裡我們僅討論 RxSwift
世界中的方案。
rx_observe
我們首先就會發現 rx_observe
這個方法,然後寫出類似下面的程式碼:
viewModel
.rx_observe(Int.self, "intVar")
.subscribeNext { [weak self] (value) in
}
.addDisposableTo(disposeBag)
我是很不喜歡這個方案的,因為它嚴重依賴屬性名字的字串,這是很不安全的做法,比較容易寫錯,變數更名的時候也很頭疼。如果不是監聽我們不能改變的程式碼,建議不要用這個方案。
PublishSubject
如果您也用過 ReactiveCocoa
,橋接過非 RAC
世界的東西到 RAC
世界,那麼您一定知道 Subject
,顯然 RxSwift
中也有 Subject
.
配合 Swift
的 didSet
,我們可以寫出如下程式碼:
var intVar: Int {
didSet {
_rx_intVar.onNext(intVar)
}
}
var rx_intVar: Observable<Int> {
return _rx_intVar.asObservable()
}
private var _rx_intVar = PublishSubject<Int>()
這個方案比上一個方案好多了,沒有硬編碼的字串(屬性名),但似乎看起來很囉嗦(確實也是如此)。
Variable
其實 RxSwift
還給了我們一個方便的方案,那就是 Variable
,我們來看看怎麼寫:
var rx_intVar: Variable<Int> = Variable(0)
var intVar: Int {
get {
return rx_intVar.value
}
set {
rx_intVar.value = newValue
}
}
顯然這是我最喜歡的方案,示例中的 intVar
在外界看起來跟沒有用 RxSwift
的時候沒有什麼差別,同時我們還能通過 rx_intVar
監聽它的變化,又沒有硬編碼字串依賴。