6

I've added -com.apple.CoreData.ConcurrencyDebug 1 flag to my target. The problem is that I have a background block that is running, and crashes when I'm using either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType

My Code:

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

I've also tried:

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

In both situations I get:

CoreData`+[NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor]:

Thanks for your help,

1 Answer 1

7

That's not how Core Data queue concurrency works. When using either NSPrivateQueueConcurrencyType or NSMainQueueConcurrencyType, you need to use the performBlock or performBlockAndWait methods on NSManagedObjectContext whenever you access the context. The fact that you're using GCD here is irrelevant; if you're using queue concurrency, you must use those methods, or you're doing it wrong.

You need to put your fetchUserWithContext call inside a block passed to one of those methods. You also need to put anything else that accesses objects fetched from the context inside a block passed to one of those methods.

Sign up to request clarification or add additional context in comments.

1 Comment

I guest that was the missing part. Thank you!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.