2015-03-22 5 views
5

Dodałem flagę -com.apple.CoreData.ConcurrencyDebug 1 do mojego celu. Problem polega na tym, że mam bloku tła, na którym działa, i wywala gdy używam albo NSPrivateQueueConcurrencyType lub NSMainQueueConcurrencyTypeUżywanie -com.apple.CoreData.ConcurrencyDebug 1 w przypadku awarii bloku asynchronicznego w obu kontrakcjach MainContext i PrivateContext

mój kod:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
NSManagedObjectContext *privateManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
[privateManagedObjectContext setParentContext:_mainContext]; 
[User fetchUserWithContext:_ privateManagedObjectContext]; 
}]; 

Ja również próbowałem:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
[User fetchUserWithContext:_mainContext]; 
}]; 

W obu sytuacjach otrzymuję:

CoreData` + [NSManagedObjectContext Wielowątkowość_Violat ion_AllThatIsLeftToUsIsHonor]:

Dzięki za pomoc,

Odpowiedz

7

To nie działa Rdzeń danych kolejki współbieżności. Podczas korzystania z NSPrivateQueueConcurrencyType lub NSMainQueueConcurrencyType, musisz użyć metod performBlock lub performBlockAndWait na każdym etapie uzyskiwania dostępu do kontekstu. Fakt, że używasz GCD tutaj, jest nieistotny; jeśli używasz współbieżności w kolejce, musisz użyć tych metod lub robisz to źle.

Musisz umieścić swoje połączenie fetchUserWithContext wewnątrz bloku przekazanego do jednej z tych metod. Musisz również umieścić cokolwiek innego, co uzyskuje dostęp do obiektów pobieranych z kontekstu wewnątrz bloku przekazanego do jednej z tych metod.

+0

Ja gość to była brakująca część. Dziękuję Ci! – Lasti

Powiązane problemy