【问题标题】:Simple observable struct with RxSwift?使用 RxSwift 的简单可观察结构?
【发布时间】:2016-07-27 09:52:52
【问题描述】:

我正在尝试在 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 解决方案;我真的很喜欢它是一个基于协议的解决方案而不是侵入性的。就我而言,我的项目中有一个对象,其中每个属性都是在后台异步设置的(蓝牙设备)。所以我需要观察/订阅更改,而不是实时获取/设置属性。

我一直听说 RxSwift 会做到这一点,甚至更多。但是,我找不到一个简单的例子来匹配上面并开始认为 RxSwift 对我的需要来说太过分了?感谢您的帮助。

【问题讨论】:

  • 如果您发布项目中对象的实际代码并展示您如何设置其属性可能会更好。 RxSwift 中有多种工具可以解决这个问题。

标签: swift swift2 rx-swift reactive-cocoa-3


【解决方案1】:

使用 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,这很像 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)

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多