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:
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?
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?
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
- NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
- [nc addObserver:self
- selector:@selector(mergeChanges:)
- name:NSManagedObjectContextDidSaveNotification
- object:ctx];
- - (void)mergeChanges:(NSNotification *)notification
- {
- NSLog(@"Merge Changes");
- AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate];
- NSManagedObjectContext *mainContext = [app managedObjectContext];
- // Merge changes into the main context on the main thread
- dispatch_async(dispatch_get_main_queue(),^{
- [mainContext mergeChangesFromContextDidSaveNotification:notification];
- });
- }
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?
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 ()