使用 RxSwift 的简单可观察结构?
Simple observable struct with RxSwift?
我试图在 Swift 中想出一个简单的可观察对象并考虑使用 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 的可观测值的纯 Swift 解决方案;我真的很喜欢它是基于协议的解决方案而不是侵入性的。就我而言,我的项目中有一个对象,其中每个 属性 都是在后台(蓝牙设备)异步设置的。所以我需要 observe/subscribe 实时更改而不是 getting/setting 属性。
我一直听说 RxSwift 会做到这一点,甚至更多。但是,我找不到一个简单的例子来匹配上面的内容,开始认为 RxSwift 对我的需要来说太过分了?感谢您的帮助。
使用 RxSwift 快速实现此可观察性的最简单方法可能是使用 RxSwift class 变量(此处所有代码都未经测试):
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,这很像 reduce 在普通数组上的作用:
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)
我试图在 Swift 中想出一个简单的可观察对象并考虑使用 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 的可观测值的纯 Swift 解决方案;我真的很喜欢它是基于协议的解决方案而不是侵入性的。就我而言,我的项目中有一个对象,其中每个 属性 都是在后台(蓝牙设备)异步设置的。所以我需要 observe/subscribe 实时更改而不是 getting/setting 属性。
我一直听说 RxSwift 会做到这一点,甚至更多。但是,我找不到一个简单的例子来匹配上面的内容,开始认为 RxSwift 对我的需要来说太过分了?感谢您的帮助。
使用 RxSwift 快速实现此可观察性的最简单方法可能是使用 RxSwift class 变量(此处所有代码都未经测试):
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,这很像 reduce 在普通数组上的作用:
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)