How can I track/observe all changes within a subgraph?

前端 未结 3 976
臣服心动
臣服心动 2020-12-22 17:08

I have a NSManagedObjectContext in which I have a number of subclasses of NSManagedObjects such that some are containers for others. What I\'d like to do is watch a top-lev

相关标签:
3条回答
  • 2020-12-22 17:39

    here's a simple example in 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)")
            }
        }
    
    0 讨论(0)
  • 2020-12-22 17:42

    for me it's just lost following two func, maybe this save hours for someone

    func controllerWillChangeContent(controller: NSFetchedResultsController) {
        tableView.beginUpdates()
    }
    
    func controllerDidChangeContent(controller: NSFetchedResultsController) {
        tableView.endUpdates()
    }
    
    0 讨论(0)
  • 2020-12-22 17:44

    You will want to listen for the NSManagedObjectContextObjectsDidChangeNotification to pick up all changes to your data model. This can be done using code like the following:

    [[NSNotificationCenter defaultCenter] 
          addObserver:self 
             selector:@selector(handleDataModelChange:) 
                 name:NSManagedObjectContextObjectsDidChangeNotification 
               object:myManagedObjectContext];
    

    which will trigger -handleDataModelChange: on any changes to the myManagedObjectContext context.

    Your -handleModelDataChange: method would look something like this:

    - (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
    }
    

    As you can see, the notification contains information on which managed objects were updated, deleted, and inserted. From that information, you should be able to act in response to your data model changes.

    0 讨论(0)
提交回复
热议问题