【发布时间】:2018-10-04 09:47:19
【问题描述】:
我有一个 NSManagedObject Folder 的子类,状态为 Availability
@objc enum Availability: Int16 {
case unknown
case available
case unavailable
}
每当可用性发生变化时,文件夹都必须执行额外的操作(例如删除相关文件)。所以我有
-
internalAvailability保存在核心数据中 - 使用上述属性计算属性
availability
`
extension Folder {
@NSManaged private var internalAvailability: Availability
}
extension Folder {
private func deleteFiles(...) {
...
}
@objc dynamic public var availability: Availability {
get {
return internalAvailability
}
set {
willChangeValue(forKey: "availability")
deleteFiles()
internalAvailability = newValue
didChangeValue(forKey: "availability")
}
}
}
使用 Reactive,我想根据可用性更改导航项的标题,但信号永远不会被调用一次!
```
let property = DynamicProperty<NSNumber>(object: folder, keyPath: "availability")
internalVariable = property // To have a reference of property
navigationItem.reactive.title <~ property.map { (stateNumber) -> String in
guard let a = Availability(rawValue: stateNumber.int16Value) else {
assertionFailure()
return ""
}
let prefix = a == .available ? "" : "(Nope) "
return "\(prefix)\(folder.name)"
}
我已明确将 KVO 合规性添加到该属性中,希望这可以开始工作,但可惜没有结果。
编辑:如果我在internalAvailability 上创建DynamicProperty 而不是availability,一切都会顺利进行..
【问题讨论】:
-
我认为你的问题不在于 KVO,而在于 ReactiveSwift 和 ARC,
<~中缀运算符返回Disposable,尝试像使用 @987654334 一样引用这个一次性@,这将使这个 Disposable 保持活力。 -
那行不通。 :( 额外信息:如果我在
internalAvailability上创建DynamicProperty而不是availability,一切都会顺利进行。 -
我不熟悉 ReactiveSwift,但是this 相关吗?
-
你试过用正常的KVO观察属性吗?这应该能让我们弄清楚问题是出在 KVO 实现还是 ReactiveSwift 部分。
-
是的,我试过了,正常的 KVO 也不起作用。
标签: ios core-data key-value-observing reactive-cocoa reactive-swift