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

标签 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 向信号生成器添加一个映射函数以查看它是否正在触发,但是在更新 tempObject.property 时没有看到任何东西。再次强调,这可能是我遗漏的一件微不足道的事情,非常感谢。

编辑

NachoSoto 成功了——我需要让我的属性(property)符合 KVO 标准。我也结束了这样做:

let tempObjectSignal: MutableProperty<TempObject> = MutableProperty(tempObject)
let propertyObserver: MutableProperty<String> <~ tempObjectSignal.producer.map({ $0.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 运行时的一部分,方法是将该类设为 NSObject 的子类,或者使用dynamic 关键字:

class TempObject: NSObject {
    dynamic var property: String
}

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

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

关于ios - 在 Swift 中使用 ReactiveCocoa 4 观察对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34831299/

相关文章:

wpf - 触发命令时强制绑定(bind)更新

c# - Prism 。关闭使用 IDialogService 创建的对话框

java - Android Studio 的数据绑定(bind)模板?

javascript - WKWebView 评估 JavaScript 返回值

ios - 如何从 Swift 中访问 CLLocationManager?

ios - 在 navigationController 下面创建一个带有 segmentController 的 pageViewController

IOS video over video 与圆形裁剪合并

ios - .mov 与 iOS SDK 分开?

ios - uiscrollview 滞后于渐变单元格背景

arrays - 解开一个实际有值的可选时为零