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ą!

Author: Lorenzo B, 2012-09-05

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.

 34
Author: Jody Hagins,
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]; 
 }];
 1
Author: mkral,
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