1. 程式人生 > >RxSwift 中監聽物件屬性改變的方式小結:rx_observe, PublishSubject 和 Variable

RxSwift 中監聽物件屬性改變的方式小結:rx_observe, PublishSubject 和 Variable

日常開發中,我們經常都要去觀察一個物件屬性的改變,那麼我們怎麼去監聽它比較好呢?

我們的選擇還是蠻多的,不過這裡我們僅討論 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.

配合 SwiftdidSet,我們可以寫出如下程式碼:

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 監聽它的變化,又沒有硬編碼字串依賴。