Coredata Zugriff über Backgroundthread

  • Coredata Zugriff über Backgroundthread

    Hallo,

    Coredata ist ja nicht ohne weiteres Threadsafe.
    Laut Doku soll jeder Thread seinen eigenen ManagedObjectContext haben.

    So weit so gut.
    Jetzt will man diese ja auch zusammenführen.

    Wenn ich jetzt den neuen ObjectContext im Thread erstelle, gibt es die Möglichkeit eine Notification bei Änderungen des Contexts zu senden:

    Quellcode

    1. NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    2. [nc addObserver:self
    3. selector:@selector(mergeChanges:)
    4. name:NSManagedObjectContextDidSaveNotification
    5. object:ctx];
    6. - (void)mergeChanges:(NSNotification *)notification
    7. {
    8. NSLog(@"Merge Changes");
    9. AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    10. NSManagedObjectContext *mainContext = [app managedObjectContext];
    11. // Merge changes into the main context on the main thread
    12. dispatch_async(dispatch_get_main_queue(),^{
    13. [mainContext mergeChangesFromContextDidSaveNotification:notification];
    14. });
    15. }
    Alles anzeigen


    Somit bekommt der mainContext die Änderungen also mit.

    Aber der Context im Thread bekommt doch keine Änderungen am MainContext mit oder?
    Müsst sowas equivalent für den MainContext ebenfalls implementiert werden?

    Oder gibt es sowas wie folgendes?

    Quellcode

    1. NSManagedObjectContext *ctx = [[NSMangedObjectContext alloc]initWithContext:mainContext]


    Ab iOS 5 gibt es wohl auch die Möglichkeit den Context anders zu erzeugen.
    Stichwort: NSPrivateQueueConcurrencyType

    Hierbei soll der Context in einem eigenen Thread laufen.
    Zugriffe über die Datenbank sollen dann mit: [context performBlock^{}] threadsafe sein.

    performBlock: ist aber Asynchron.
    performBlockAndWait: ist Synchron und läuft in dem Thread ab aus dem der aufruf kommt.
    Ist das dann trotzdem Threadsafe?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Erebos1988 ()