2016-04-06 110 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)