Kerndaten und Parallelität mit NSOperationQueues

Nach der Verwendung von Instruments habe ich in meinem Code einen Punkt gefunden, der sehr lange läuft und meine Benutzeroberfläche blockiert: viele Core Data-Abrufe (dies ist Teil eines Prozesses, bei dem ein großes JSON-Paket aufgenommen und verwaltete Objekte aufgebaut werden, während sichergestellt wird, dass Objekte vorhanden sind nicht dupliziert werden).

Während ich beabsichtige, diese Anfrage in kleinere Teile zu zerlegen und sie seriell zu verarbeiten, bedeutet dies nur, dass ich diese Abrufe verteile. Ich gehe davon aus, dass die App kleine Ruckelanfälle anstelle eines langen Schluckaufs hervorruft.

Alles, was ich sowohl in den Apple-Dokumenten als auch online in verschiedenen Blogposts gelesen habe, zeigt, dass Core Data und die gleichzeitige Nutzung mit dem Stoßen eines Bienenstocks vergleichbar sind. Also habe ich mich schüchtern hingesetzt, um es am alten College zu versuchen. Nachstehend habe ich mir etwas ausgedacht, und ich würde mich freuen, wenn jemand darauf hinweist, dass ich sicher bin, dass ich Fehler geschrieben habe.

Der unten angegebene Code funktioniert. Was ich gelesen habe, hat mich eingeschüchtert, dass ich mit Sicherheit etwas falsch gemacht habe; Ich habe das Gefühl, als hätte ich die Nadel aus einer Granate gezogen und warte nur darauf, dass sie unerwartet abgeht!

NSBlockOperation *downloadAllObjectContainers = [NSBlockOperation blockOperationWithBlock:^{
    NSArray *containers = [webServiceAPI findAllObjectContainers];
}];

[downloadAllObjectContainers setCompletionBlock:^{

    NSManagedObjectContext *backgroundContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [backgroundContext setPersistentStoreCoordinator:[_managedObjectContext persistentStoreCoordinator]];

    [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification
                                                      object:backgroundContext
                                                       queue:[NSOperationQueue mainQueue]
                                                  usingBlock:^(NSNotification *note) {
                                                      [_managedObjectContext mergeChangesFromContextDidSaveNotification:note];
                                                  }];


        Builder *builder = [[Builder alloc] init];
        [builder setManagedObjectContext:backgroundContext];

        for (ObjectContainer *objCont in containers) {  // This is the long running piece, it's roughly O(N^2) yuck!
            [builder buildCoreDataObjectsFromContainer:objCont];
        }

    NSError *backgroundContextSaveError = nil;
    if ([backgroundContext hasChanges]) {
        [backgroundContext save:&backgroundContextSaveError];
    }
}];

NSOperationQueue *background = [[NSOperationQueue alloc] init];
[background addOperation:downloadAllObjectContainers];

Antworten auf die Frage(2)

Ihre Antwort auf die Frage