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

可以看到,该通知中包含的信息在其上的管理对象进行了更新,删除和插入。从这些信息中,你应该能够响应你的数据模型的变化采取行动。

其他提示

这里是在夫特一个简单示例:

    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()
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top