我有一个NSManagedObjectContext,其中包含一些NSManagedObject的子类,其中一些是其他对象的容器。 我想要做的是监视顶级对象,以便在该对象的任何属性、关联或其包含的任何对象的属性/关联发生更改时得到通知。
使用上下文的“hasChanges”方法不能给我足够的细粒度。 对象的“isUpdated”方法仅适用于特定的对象(而不是其关联中的任何内容)。 是否有一种方便的(也许是基于KVO的)方法可以观察仅限于子图的上下文中的更改?
我有一个NSManagedObjectContext,其中包含一些NSManagedObject的子类,其中一些是其他对象的容器。 我想要做的是监视顶级对象,以便在该对象的任何属性、关联或其包含的任何对象的属性/关联发生更改时得到通知。
使用上下文的“hasChanges”方法不能给我足够的细粒度。 对象的“isUpdated”方法仅适用于特定的对象(而不是其关联中的任何内容)。 是否有一种方便的(也许是基于KVO的)方法可以观察仅限于子图的上下文中的更改?
您需要监听NSManagedObjectContextObjectsDidChangeNotification
来捕获数据模型的所有更改。可以使用以下代码实现:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleDataModelChange:)
name:NSManagedObjectContextObjectsDidChangeNotification
object:myManagedObjectContext];
当myManagedObjectContext
上下文发生任何更改时,将触发-handleDataModelChange:
您的-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)")
}
}
let observation = NSNotificationCenter.defaultCenter().addObserverForName(..){..}
,以便通过调用 NSNotificationCenter.defaultCenter().removeObserver(observation)
停止观察。 - Lev LandauNSNotificationCenter.defaultCenter().addObserverForName(..){..}
,您需要保留返回的观察对象。 - Lev Landau对我来说,只是迷失了以下两个函数,也许这可以为某些人节省几个小时
func controllerWillChangeContent(controller: NSFetchedResultsController) {
tableView.beginUpdates()
}
func controllerDidChangeContent(controller: NSFetchedResultsController) {
tableView.endUpdates()
}
NSManagedObjectContextDidSaveNotification
在每次保存上下文后过滤更改。 - krasnyk