3

我的项目具有CoreData具有 1 个根上下文和多个子上下文的数据库。我有一个ViewModel包含一个项目(NSManagedObject)。当我更改项目中的某些内容时,会在根上下文中进行持久化,然后自动合并到所有子上下文中。

我想NSFetchedResultsControllerReactiveSwiftSignals/Properties 替换,以观察项目对象的变化。

视图模型:

var itemProperty: MutableProperty<Item> = MutableProperty(contextItem)

视图控制器:

self.viewModel.itemProperty.signal.observeValues{ (item: Item) in
     let newName = item.name
     print("name: \(newName!)" 
 }

在我在其他地方更改项目名称后,更改将传播到ViewModel子上下文(NSFetchedResultsController得到通知),但信号永远不会推送新item事件。

也许是因为NSManagedObject参考永远不会改变?我知道我可以用 观察对象中特定属性的变化producer(forKeyPath: "propertyKeyPath" ),但我不想只观察项目的一个特定属性,我想观察所有变化。

有没有办法观察所有对象属性的任何变化?

4

2 回答 2

0

你可以观察NSManagedObjectContextObjectsDidChange。这可能有点矫枉过正,因为它会在任何对象发生任何更改时发送通知。但是我使用它没有任何明显的性能影响。这是Apple 文档

的主要缺点NSManagedObjectContextObjectsDidChange是它不会为您提供更改的键或值。如果您需要,请意识到在所有属性上创建观察者可能并不像您想象的那么繁琐。它可以在一个循环中完成,迭代其文档NSEntityDescription.properties底部列出的其他四个类似属性之一。

于 2019-04-29T21:50:41.870 回答
0

所以很明显,经过一些研究,我发现 ReactiveCocoa 并没有很好地准备与 Core Data 一起工作。仅使用 ReactiveCocoa/ReactiveSwift 无法接收 NSManagedObject 更新。

一种选择是使用 NSFetchedResultsController 的每次更新来更新 ItemProperty,并在属性的关联信号上触发一个新事件:

var entityProperty: MutableProperty<MyEntity>

override func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) 
{
    entityProperty.value = anObject as! MyEntity
}

另一种选择可能是获取更新我实体中特定属性的信号:

var myEntity: MyEntity

// ReactiveObjectiveC
myEntity.rac_values(forKeyPath: "name", observer: self)

// ReactiveSwift
myEntity.reactive.signal(forKeyPath: "name")
于 2019-06-17T22:24:23.677 回答