1

Fakten:NSManagedObjectContext fusionieren von privaten Kontext, aktualisieren Sie nur Objekte geändert

  • I Coredata verwenden.
  • Ich habe Elternobjekt mit untergeordneten Zeilen, wo Kinder 500 Objekte möglicherweise überschreiten können.
  • Ich zeige diese untergeordneten Objekte in UITableViewControllerUITableView.
  • Ich habe es eingerichtet, um mit NSFetchedResultsController arbeiten, so dass ich Updates erhalten, sobald sich etwas ändert. Und ich brauche das.
  • Ich Verschmelzung Änderungen von privaten Kontext zu Haupt Zusammenhang mit dem folgenden Code:

    @objc func privateContextDidSaveNotification(notification: NSNotification) 
    {    
        let savedContext = notification.object as! NSManagedObjectContext 
    
        if savedContext == self.managedObjectContext 
        { 
         return // This is the Main context 
        } 
    
        if savedContext.persistentStoreCoordinator != self.managedObjectContext.persistentStoreCoordinator 
        { 
         return // This is different DB 
        } 
    
        self.managedObjectContext.performBlockAndWait(
        { 
         self.managedObjectContext.mergeChangesFromContextDidSaveNotification(notification) 
         self.managedObjectContext.refreshAllObjects() 
        }) 
    } 
    
  • NSFetchedResultsController.delegate gesetzt ist nur auf untergeordnete Objekte.

Problem:

Wenn auch nur ein Kind-Objekt für diese übergeordnete Objekt ändert, wird die func controller(controller: NSFetchedResultsController, didChangeObject anObject: AnyObject, atIndexPath indexPath: NSIndexPath?, forChangeType type: NSFetchedResultsChangeType, newIndexPath: NSIndexPath?) für alle untergeordneten Zeilen aufgerufen wird, das heißt, es heißt> 500 Mal, und im Grunde die App gefriert.

Was ich entdeckt:

  1. Die Update-Benachrichtigungen für alle untergeordneten Objekte durch diese Linie nach merge verursacht: self.managedObjectContext.refreshAllObjects().
  2. Wenn ich diese Zeile entfernen, erhält NSFetchedResultsController keine Benachrichtigung, dass etwas überhaupt aktualisiert wird - aber ich brauche das.

Fragen:

  1. Wie kann ich, dass eine bestimmte Reihe von geändertenem Kind-Objekt machen, das heißt - wie kann ich NSFetchedResultsController nur tatsächlich geänderte Zeilen mitteilen?
  2. Was ist die typische Lösung, um NSFetchedResultsController über zusammengeführte Objekte zu benachrichtigen?

Vielen Dank!

Maris

Antwort

0

Sie können nun NSPersistentContainer Setup Ihren Stack verwenden. Die neuen Container viewContext und backgroundContext senden und konsumieren automatisch Benachrichtigungen und führen sie aus der PersistentStoreCordinator zusammen.

Auf diese Weise brauchen Sie nicht selbst die fusionieren zu verwalten und die NSFetchedResultController, dass das Setup auf der viewContext

aktualisieren wird