如何跟踪/观察子图内的所有更改?

我有一个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 } 

正如您所看到的,通知包含关于哪些被pipe理对象被更新,删除和插入的信息。 从这些信息中,您应该能够响应您的数据模型更改。

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,也许这为一个人节省了几个小时

 func controllerWillChangeContent(controller: NSFetchedResultsController) { tableView.beginUpdates() } func controllerDidChangeContent(controller: NSFetchedResultsController) { tableView.endUpdates() }