2013-05-20 15 views
6

Obiekty NSManagedObjectContext miały performBlock: i performBlockAndWait: metody dodane w celu ułatwienia współbieżności. Używałem ich - potencjalnie dość naiwnie - i właśnie zdałem sobie sprawę, że jest pytanie, którego nigdy nie zadałem.Czy można użyć obiektu NSManagedObject poza jego ustawieniem performBlock?

Jeśli utworzę podklasę NSManagedObject w jednej z metod performBlock, wątek "domowy" jest wątkiem kontekstu nadrzędnego - który w przypadku NSPrivateQueueConcurrencyType jest prawdopodobnie niezależnym wątkiem, do którego nie mam innego dostępu.

Czy muszę wykonać wywołanie performBlock, aby uzyskać dostęp do danych zawartych w zarządzanych obiektach? Czy jest tam magia tła, która pomaga chronić mnie w przypadku korzystania z getters? (Lub setery, choć wydaje się to złym pomysłem ...)

Odpowiedz

13

NSManagedObject nie powinien być używany poza wątkiem/kolejką o numerze managedObjectContext (czasami działa i czasami się zawiesza ==> nie rób tego to).

CoreData nie gwarantuje bezpiecznego odczytu do obiektu.

Aby uzyskać dostęp do obiektu należącego do „kolejce” prywatny kontekście zawsze użyć [context performBlock:...] lub [context performBlockAndWait:...], chyba że masz dostęp do swoich objectID lub managedObjectContext właściwości.

+0

Dzięki, prawie to, co uważałem za konieczne ... Miałem nadzieję, że się mylę. Muszę ponownie obejrzeć wideo z WWDC, w którym wprowadzono tę technikę, ponieważ nie pamiętam, żeby to robili ... Z drugiej strony podejrzewam, że istnieje wiele filmów WWDC, które muszę ponownie obejrzeć. – RonLugge

+1

Chciałbym tylko dodać, że inżynierowie Apple wyraźnie stwierdzają, że odczyty na 'NSManagedObject' nie są bezpieczne dla wątków, ponieważ podstawowe dane buforują, a zapisy w pamięci podręcznej nie są bezpieczne dla wątków –

9

Musisz użyć performBlock: lub performBlockAndWait:, ale jest jeden wyjątek. Jeśli używasz NSMainQueueConcurrencyTypei używasz zarządzanego obiektu w głównej kolejce, możesz uzyskać do niego dostęp bezpośrednio, bez blokowania. Może to być bardzo wygodne, gdy musisz zaktualizować swój interfejs z zarządzanego obiektu i na odwrót.

+1

Kolejnym wyjątkiem jest' NSConfinementConcurrencyType', który jest podobny do głównej kolejki , tylko do określonego wątku ("stara" wersja zarządzanych kontekstów) –

+0

Chyba powinienem był lepiej sformułować moje pytanie, ponieważ dotyczy to TYLKO typów NSPrivateQueue i NSMainQueue ... nawet wtedy, głównie do wersji kolejki prywatnej dzięki temu cudownemu wyjątkowi. – RonLugge

Powiązane problemy