繁体   English   中英

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

[英]ReactiveSwift: Observe Managed Object changes with MutableProperty

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

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

视图模型:

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" )观察对象中特定属性的更改,但我不想只观察该项的一个特定属性,我想观察所有更改。

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

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

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

很明显经过一些研究后我发现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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM