2016-04-06 19 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からの観測のための純粋なスウィフトソリューションです。私はそれがプロトコルベースのソリューションであり、侵襲的ではないことが本当に好きです。私の場合は、私のプロジェクトには、各プロパティがフードの下で非同期に設定されているオブジェクト(Bluetoothデバイス)があります。だから、私はリアルタイムでプロパティを取得/設定するのではなく、変更を観察/購読する必要があります。

私はRxSwiftがそれ以上のことを行うと聞いています。しかし、私はRxSwiftが私の必要性のために過度のものであると考えるために、上記と一致する簡単な例を見つけることができません。助けてくれてありがとう。すぐに、これはRxSwiftで観察は、おそらくRxSwiftクラス変数を使用することであろうようにする

+0

それはおそらく良いだろう。これを解決するために、もちろん、多くの方法があり、RxSwiftyの方法は、おそらく通常の配列に減らすように多くの作品行いscan operation to your element sequenceを、追加することですあなたのプロジェクトからオブジェクトを取得し、そのプロパティをどのように設定するかを示します。 RxSwiftボックスには、この問題に適用できるさまざまなツールがあります。 –

答えて

3

最も簡単な方法(ここでは、すべてのコードは、私の頭の上から未検証です):

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. 

これで、各イベントで古い値が失われました。あなたが実際のコードを掲載場合

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) 
関連する問題