2013-01-01 7 views
12

Was wäre der beste Weg, um mein Core Data-Schema mit einer Remote-API zu synchronisieren, die JSON bereitstellt? Im Moment durchlaufe ich jedes Wörterbuch in der JSON-Antwort und überprüfe Core-Daten, um zu sehen, ob die API-ID existiert.Was ist die effizienteste Methode zum Synchronisieren von Core Data mit der JSON-API?

Das funktioniert gut, aber jetzt müssen nur noch lokale Objekte gelöscht werden, die sich nicht auf dem Server befinden. Hier ist ein Beispiel für meine JSON-Daten:

[ 
    { 
     "id":1234, 
     "name":"My first object", 
     "description":"This is a long string with lots of information" 
    }, 
    { 
     "id":1235, 
     "name":"My second object", 
     "description":"This is a long string with lots of information" 
    } 
] 

Derzeit ist die einzige Art, wie ich denke, kann dies zu erreichen, ist in etwa wie folgt:

NSArray *jsonData = // Convert json data to array using NSJSONSerialization 
NSInteger fetchedCount = _fetchedResultsController.fetchedObjects.count; 

if (fetchedCount != jsonData.count) { 

    for (int i = 0; i < fetchedCount; i++) { 

     NSManagedObject *object = [_fetchedResultsController objectAtIndexPath: [NSIndexPath indexPathForItem:i 
                            inSection:0]]; 
     NSNumber *idNumber = object.apiID; 

     BOOL shouldDelete = YES; 

     for (NSDictionary *jsonDict in jsonData) { 
      if ([jsonDict objectForKey:@"id"] == idNumber) { 
       shouldDelete = NO; 
      } 
     } 

     if (shouldDelete) { 

      // Delete object. 
     }    
    } 
} 

denke ich, dass massiv ineffizient sein wird, wenn der JSON-Array enthält viele Objekte.

Antwort

19

Das könnte in Ordnung sein, aber ich denke, Sie sollten das Find-or-Create Muster in Apple Doc vorgeschlagen. Sehen Sie hier für eine tiefgehende Erklärung Efficiently Importing Data (insbesondere siehe Implementierung Find-oder-Create effizient).

Die allgemeine Idee ist ziemlich einfach. Sie haben zwei Arrays von Objekten (das, das Sie aus Core Data abrufen und das, das Sie aus dem Service abrufen), die geordnet sind (durch apiID und id bzw.).

Offensichtlich, wenn es viele Daten gibt, empfehle ich wirklich, Operationen im Hintergrund durchzuführen. Denken Sie daran, dass jeder Thread sich auf seine NSManagedObjectContext verlassen muss. Andernfalls nutzen Sie den neuen Warteschlangenmechanismus, der von der iOS 5-API bereitgestellt wird.

Der Vollständigkeit halber schlage ich auch vor, RayWenderlich Tutorial How To Synchronize Core Data with a Web Service Teil 1 und 2 zu lesen. Es ist sehr interessant.

Hoffe, dass hilft.

+0

Danke für die Antwort und vor allem den Link Efficiently Import Data. Das ist ein guter. – squarefrog

+0

@squarefrog Gern geschehen. Upvote auch wenn Sie wollen;) Frohes neues Jahr. Prost. –

Verwandte Themen