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

时间:2016-01-16 19:42:19

标签: ios swift mvvm reactive-programming reactive-cocoa

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

在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)

根据我的理解,我应该能够使用propertyObserver来查看对tempObject.property的更改。我尝试从propertyObserver向信号生成器添加map函数以查看它是否正在触发,但在更新tempObject.property时没有看到任何内容。再说一次,这可能是我所遗漏的一件小事,非常感谢。

修改

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

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

每当tempObject.property更新时,我都要确保调用

tempObjectSignal.value = tempObject

这会发出所有必要的信号。但是,我不知道这是否打破了任何最佳做法。让我知道你的想法!

1 个答案:

答案 0 :(得分:5)

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

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

let property = DynamicProperty(tempObject, "property")

但是,出于这个原因,您需要确保要观察的属性是Objective-C运行时的一部分,方法是使类成为NSObject的子类,并使用{{ 1}}关键字:

dynamic

或使用class TempObject: NSObject { dynamic var property: String } 确保将其导出到运行时:

@objc