ReactiveSwift:使用MutableProperty观察托管对象的更改

时间:2019-04-29 19:50:38

标签: ios swift core-data reactive-cocoa reactive-swift

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

我想用NSFetchedResultsController信号/属性替换ReactiveSwift,以观察项目对象的变化。

ViewModel:

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

ViewController:

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

在其他地方更改了商品名称后,更改会传播到ViewModel子上下文中(NSFetchedResultsController得到通知),但是信号从不推送新的item事件

也许是因为NSManagedObject引用从未更改?我知道我可以使用producer(forKeyPath: "propertyKeyPath" )观察对象中特定属性的变化,但是我不想观察项目的一个特定属性,而是要观察所有变化。

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

2 个答案:

答案 0 :(得分:0)

您可以观察到NSManagedObjectContextObjectsDidChange。这可能有点过大,因为当 any 对象发生 any 更改时,它会发送通知。但是我使用它时并没有明显的性能下降。这是Apple documentation

NSManagedObjectContextObjectsDidChange的主要缺点是它不会为您提供更改的键或值。如果需要,请意识到在所有属性上创建观察者可能不会像您想象的那样繁重。可以在一个循环中进行遍历,遍历NSEntityDescription.propertiesits documentation底部列出的其他四个相似属性之一。

答案 1 :(得分: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")