Hallo,
leidiges Thema: CoreData + Threads. Ich habe dazu die Appledokumentation recht oft studiert und mir Gedanken gemacht. Es existrieren unterschiedliche Ansätze, wie CoreData gemeinsam mit Threads genutzt werden kann - u.a:
Ansatz 1: einen managedObjectContext pro Thread + object IDs weiterleiten.
Ansatz 2: einen managedObjectContext sowie einen persistentStoreCoordinator pro Thread und ebenfalls nur object IDs weiterleiten.
Mir ist nicht ganz klar, wie sich diese beiden Ansätze in der Praxis unterscheiden. Die Apple Dokumentation äußert sich zu Ansatz 1 wie folgt:
"If you want to aggregate a number of operations in one context together as if a virtual single transaction, you can lock the persistent store coordinator to prevent other managed object contexts using the persistent store coordinator over the scope of several operations."
Zu Ansatz 2:
"Using a separate persistent store coordinator for each thread allows for completely concurrent operations."
Okay. Der erste Unterschied wäre also, dass ich bei Ansatz 2 komplett aufs Locking verzichten kann. Das hört sich gut an. Ansatz 2 ist also die "fehlerunanfälligere" - falls man das so pauschal ausdrücken möchte. Richtig?
Kleines Beispiel, wie man Ansatz 2 realisiert:
Man nehme einen normalen Controller (NSObject Subclass) - mit einer Action: doSomethingComplicatedWithSomeManagedObjects. Sobald die Action getriggert wird - durch einen Button o.ä müsste folgendes erledigt werden:
1. einen persistentStoreCoordinator erzeugen, welcher das selbe managedObjectModel wie der "HauptmanagedObjectContext" (= der, des mainThreads) hat.
2. diesem persistentStoreCoordinator einen persistentStore zuweisen.
3. ein managedObjectContext erzeugen und diesem den neuen persistentStoreCoordinator zuweisen.
4. einen Thread erzeugen und diesem den erzeugten managedObjectContext sowie eine oder mehrere objectIDs (aus dem HauptmanagedObjectContext), welche für ihn von Interesse sind übergeben.
5. den Thread starten
6. der Thread macht folgendes: er holt sich mit Hilfe "seines" managedObjectContexts und dessen objectWithID: Methode sowie der an ihn übergebenen objectIDs (aus dem HauptmanagedObjectContext - siehe 4.) die managedObjects, welche allerdings nun den managedObjectContext des Threads referenzieren.
7. der Thread erledigt ganz normal seine Arbeit und am Ende wird sein managedObjectContext mit dem HauptmanagedObjectContext vereint.
Ist das alles so "okay"? Zu umständlich? Unsicher?
leidiges Thema: CoreData + Threads. Ich habe dazu die Appledokumentation recht oft studiert und mir Gedanken gemacht. Es existrieren unterschiedliche Ansätze, wie CoreData gemeinsam mit Threads genutzt werden kann - u.a:
Ansatz 1: einen managedObjectContext pro Thread + object IDs weiterleiten.
Ansatz 2: einen managedObjectContext sowie einen persistentStoreCoordinator pro Thread und ebenfalls nur object IDs weiterleiten.
Mir ist nicht ganz klar, wie sich diese beiden Ansätze in der Praxis unterscheiden. Die Apple Dokumentation äußert sich zu Ansatz 1 wie folgt:
"If you want to aggregate a number of operations in one context together as if a virtual single transaction, you can lock the persistent store coordinator to prevent other managed object contexts using the persistent store coordinator over the scope of several operations."
Zu Ansatz 2:
"Using a separate persistent store coordinator for each thread allows for completely concurrent operations."
Okay. Der erste Unterschied wäre also, dass ich bei Ansatz 2 komplett aufs Locking verzichten kann. Das hört sich gut an. Ansatz 2 ist also die "fehlerunanfälligere" - falls man das so pauschal ausdrücken möchte. Richtig?
Kleines Beispiel, wie man Ansatz 2 realisiert:
Man nehme einen normalen Controller (NSObject Subclass) - mit einer Action: doSomethingComplicatedWithSomeManagedObjects. Sobald die Action getriggert wird - durch einen Button o.ä müsste folgendes erledigt werden:
1. einen persistentStoreCoordinator erzeugen, welcher das selbe managedObjectModel wie der "HauptmanagedObjectContext" (= der, des mainThreads) hat.
2. diesem persistentStoreCoordinator einen persistentStore zuweisen.
3. ein managedObjectContext erzeugen und diesem den neuen persistentStoreCoordinator zuweisen.
4. einen Thread erzeugen und diesem den erzeugten managedObjectContext sowie eine oder mehrere objectIDs (aus dem HauptmanagedObjectContext), welche für ihn von Interesse sind übergeben.
5. den Thread starten
6. der Thread macht folgendes: er holt sich mit Hilfe "seines" managedObjectContexts und dessen objectWithID: Methode sowie der an ihn übergebenen objectIDs (aus dem HauptmanagedObjectContext - siehe 4.) die managedObjects, welche allerdings nun den managedObjectContext des Threads referenzieren.
7. der Thread erledigt ganz normal seine Arbeit und am Ende wird sein managedObjectContext mit dem HauptmanagedObjectContext vereint.
Ist das alles so "okay"? Zu umständlich? Unsicher?
Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.
Objective-C und Cocoa Band 2: Fortgeschrittene
Cocoa/Objective-C Seminare von [co coa:ding].
Objective-C und Cocoa Band 2: Fortgeschrittene
Cocoa/Objective-C Seminare von [co coa:ding].