我有一个 NSManagedObjectContext,其中有许多 NSManagedObjects 的子类,其中一些是其他的容器。我想做的是观察一个顶级对象,以了解对其任何属性、关联或它包含的任何对象的属性/关联的任何更改。
使用上下文的“hasChanges”并没有给我足够的粒度。对象 'isUpdated' 方法仅适用于给定对象(而不适用于其关联中的任何内容)。是否有一个方便的(也许是基于 KVO 的)我可以观察到仅限于子图的上下文中的变化?
我有一个 NSManagedObjectContext,其中有许多 NSManagedObjects 的子类,其中一些是其他的容器。我想做的是观察一个顶级对象,以了解对其任何属性、关联或它包含的任何对象的属性/关联的任何更改。
使用上下文的“hasChanges”并没有给我足够的粒度。对象 'isUpdated' 方法仅适用于给定对象(而不适用于其关联中的任何内容)。是否有一个方便的(也许是基于 KVO 的)我可以观察到仅限于子图的上下文中的变化?
您将需要监听以获取对NSManagedObjectContextObjectsDidChangeNotification
数据模型的所有更改。这可以使用如下代码来完成:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
这将触发-handleDataModelChange:
对myManagedObjectContext
上下文的任何更改。
你的-handleModelDataChange
: 方法看起来像这样:
- (void)handleDataModelChange:(NSNotification *)note
{
NSSet *updatedObjects = [[note userInfo] objectForKey:NSUpdatedObjectsKey];
NSSet *deletedObjects = [[note userInfo] objectForKey:NSDeletedObjectsKey];
NSSet *insertedObjects = [[note userInfo] objectForKey:NSInsertedObjectsKey];
// Do something in response to this
}
如您所见,通知包含有关更新、删除和插入哪些托管对象的信息。根据这些信息,您应该能够对数据模型的更改做出响应。
这是 Swift 中的一个简单示例:
NotificationCenter.default.addObserver(forName: .NSManagedObjectContextObjectsDidChange, object: nil, queue: nil) { note in
if let updated = note.userInfo?[NSUpdatedObjectsKey] as? Set<NSManagedObject>, updated.count > 0 {
print("updated: \(updated)")
}
if let deleted = note.userInfo?[NSDeletedObjectsKey] as? Set<NSManagedObject>, deleted.count > 0 {
print("deleted: \(deleted)")
}
if let inserted = note.userInfo?[NSInsertedObjectsKey] as? Set<NSManagedObject>, inserted.count > 0 {
print("inserted: \(inserted)")
}
}
对我来说,它只是在两个函数之后丢失了,也许这可以为某人节省几个小时
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}