2016-04-06 151 views
1

我想在Swift中想出一個簡單的可觀察對象,並認爲使用RxSwift。我無法找到一個簡單的例子,做這樣的事情:簡單的可觀察結構與RxSwift?

protocol PropertyObservable { 
    typealias PropertyType 
    var propertyChanged: Event<(PropertyType, Any)> { get } 
} 

class Car: PropertyObservable { 
    typealias PropertyType = CarProperty 
    let propertyChanged = Event<(CarProperty, Any)>() 

    dynamic var miles: Int = 0 { 
    didSet { 
     propertyChanged.raise(.Miles, oldValue as Any) 
    } 
    } 

    dynamic var name: String = "Turbo" { 
    didSet { 
     propertyChanged.raise(.Name, oldValue as Any) 
    } 
    } 
} 

以上是從this blog post觀測純迅速解決;我真的很喜歡它是基於協議的解決方案,而不是侵入式的。在我的情況下,我在我的項目中有一個對象,每個屬性在引擎蓋(藍牙設備)下異步設置。所以我需要觀察/訂閱更改,而不是實時獲取/設置屬性。

我一直聽說RxSwift會做到這一點和更多。但是,我找不到一個簡單的例子來匹配上面的內容,並開始認爲RxSwift對於我的需求是過度的?謝謝你的幫助。

+0

這將是可能更好,如果您發佈的實際代碼來自項目的對象,並展示如何設置其屬性。 RxSwift盒中有各種工具可以應用於這個問題。 –

回答

3

最簡單的方法快速做出這一觀察的與RxSwift很可能是使用RxSwift類變量(這裏所有的代碼是未經驗證了我的頭頂部):

import RxSwift 

class Car { 

    var miles = Variable<Int>(0) 

    var name = Variable<String>("Turbo") 

} 

這使您能夠觀察值通過訂閱他們:

let disposeBag = DisposeBag() 
let car = Car 
car.name.asObservable() 
    .subscribeNext { name in print("Car name changed to \(name)") } 
    .addToDisposeBag(disposeBag) // Make sure the subscription disappears at some point. 

現在你已經失去了每個事件的舊價值。當然也有許多方法來解決這個問題,RxSwifty的方式很可能是添加scan operation to your element sequence,如降低其作品很多做一個正常的數組:

car.name.asObservable() 
    .scan(seed: ("", car.name.value)) { (lastEvent, newElement) in 
    let (_, oldElement) = lastEvent 
    return (oldElement, newElement) 
    } 
    .subscribeNext { (old, new) in print("Car name changed from \(old) to \(new)") } 
    .addToDisposeBag(disposeBag)