在 Swift 中使用 ReactiveCocoa 4 观察对象属性

Observing object properties with ReactiveCocoa 4 in Swift

作为序言,这可能是一个非常简单的 and/or 无知问题。

在 ReactiveCocoa 2.x 中,我们能够使用 RACObserve 和 RAC 来观察对象的属性。根据我在 Reactive 3 和 4 中可以找到的文档,我们现在使用 PropertyType 来观察对象的变化 属性。到目前为止,我在使用 MutableProperty 或 DynamicProperty 时未能观察到任何 属性 变化。

class TempObject {
  var property: String
}

let tempObject = TempObject()
let propertyObserver: MutableProperty<String> = MutableProperty(tempObject.property)

据我了解,我应该可以使用 属性Observer 来查看对 tempObject.property 的更改。我尝试从 属性Observer 向信号生成器添加一个映射函数以查看它是否正在触发,但在更新 tempObject.property 时没有看到任何东西。再次,可能是我遗漏的一件小事,非常感谢。

编辑

NachoSoto 做到了 - 我需要让我的 属性 KVO 兼容。我也结束了这样做:

let tempObjectSignal: MutableProperty<TempObject> = MutableProperty(tempObject)
let propertyObserver: MutableProperty<String> <~ tempObjectSignal.producer.map({ [=12=].property })

每当 tempObject.property 更新时,我一定会调用

tempObjectSignal.value = tempObject

这会触发所有必要的信号。不过,我不知道这是否违反了任何最佳实践。让我知道你的想法!

MutableProperty(value) 创建一个可变的 属性 but only with value that as the initial value.

您要使用的是 DynamicProperty,它将使用 Objective-C 运行时和 KVO 来检测对对象 属性:

的更改
let property = DynamicProperty(tempObject, "property")

但是,出于这个原因,您需要确保要观察的 属性 是 Objective-C 运行时的一部分,方法是将 class 设为子[= NSObject 的 32=],并通过使用 dynamic 关键字:

class TempObject: NSObject {
    dynamic var property: String
}

或使用 @objc 确保它被导出到运行时:

class TempObject: NSObject {
    @objc var property: String
}