Jak utworzyć dziecko nsmanagedobjectcontext?
Widziałem kilka filmów / wątków, które mówią, że można tworzyć "dzieci" MOCs -- MOCs, które używają innych MOCs jako swoich trwałych sklepów. Przydatne, na przykład, w kontekście, w którym tworzysz wątki aplikacji i chcesz mieć pojedynczy główny MOC, który może zapisać / cofnąć zmiany, które tworzą wątki potomne. (Z tego co rozumiem, MOC i to managedObjects muszą być używane w tym samym wątku)
Pytanie brzmi, jak stworzyć dziecko MOC? Nie mogę namierzyć filmy WWDC, które oglądałem, które je przedstawiały, a wszystko, co widziałem, mówiło o tym, jak z nich korzystać, gdy zostaną wykonane. Mogę łatwo przypisać nowy MOC, ale jak ustawić, że to trwały sklep, aby być innym MOC? Referencja nie pokazuje żadnych funkcji, które to robią!
2 answers
Utwórz nowy MOC, dla którego masz całkowitą kontrolę nad synchronizacją. Jest to to samo co wywołanie init
I takie samo zachowanie jak relacje Pre-rodzic/dziecko.
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSConfinementConcurrencyType];
Rodzisz MOC do innego MOC, ustawiając jego właściwość:
moc.parentContext = someOtherMocThatIsNowMyParent;
Tutaj dziecko wybiera rodzica. Jestem pewien, że moje dzieci chciałyby być NSManagedObjectContexts. Kontekst nadrzędny musi być NSPrivateQueueConcurrencyType
lub NSMainQueueConcurrencyType
.
Możesz utworzyć MOC, która jest "związana" z prywatnym Kolejka:
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
Co oznacza, że należy uzyskać do niego dostęp tylko za pośrednictwem API performBlock
lub performBlockAndWait
. Możesz wywołać te metody z dowolnego wątku, ponieważ zapewnią one prawidłową serializację kodu w bloku. Na przykład...
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
// All code running in this block will be automatically serialized
// with respect to all other performBlock or performBlockAndWait
// calls for this same MOC.
// Access "moc" to your heart's content inside these blocks of code.
}];
Różnica między performBlock
a performBlockAndWait
polega na tym, że performBlock
utworzy blok kodu i zaplanuje go z Grand Central Dispatch do wykonania asynchronicznie w przyszłości, w jakimś nieznanym wątku. Wywołanie metody zwróci natychmiast.
performBlockAndWait
wykona magiczną synchronizację ze wszystkimi innymi wywołaniami performBlock
, a gdy wszystkie bloki, które zostały przedstawione przed tym, zostaną wykonane, blok ten zostanie uruchomiony. Wątek wywołujący będzie trwał do zakończenia tego wywołania.
Można również utworzyć MOC, która jest "związana" z głównym wątkiem, podobnie jak prywatna współbieżność.
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
// All code running in this block will be automatically serialized
// with respect to all other performBlock or performBlockAndWait
// calls for this same MOC. Furthermore, it will be serialized with
// respect to the main thread as well, so this code will run in the
// main thread -- which is important if you want to do UI work or other
// stuff that requires the main thread.
}];
Co oznacza, że powinieneś uzyskać do niego bezpośredni dostęp tylko wtedy, gdy wiesz, że jesteś w głównym wątku, lub poprzez performBlock
lub performBlockAndWait
API.
Teraz możesz użyć MOC "main concurrency" albo za pomocą metod performBlock
, albo bezpośrednio jeśli wiesz, że już działasz w głównym wątku.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 22:10:19
Inicjalizuj child MOC wtedy:
[_childMOC performBlockAndWait:^{
[_childMOC setParentContext:parentMOC];
}];
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 22:04:08