I have a problem that is almost identical to the problem described by this person here, but it hasn\'t get answered:
http://www.cocoabuilder.com/arc
For my iOS 6 app, I have the same concurrency setup as the OP - a parent MOC using a private queue and a child MOC on the main thread. I also have an NSFetchedResultsController which uses the child MOC to update a UITableViewController. Both these MOCs are initialized in the AppDelegate and are to be used across the app. The AppDelegate has two methods, savePrivateThreadMOCToCoreData and saveMainThreadMOCToCoreData, to persist changes to CD. At launch, I dispatch a coredata initializer on a private queue as follows. The idea is to immediately drop the user into the table view and allow the initializer to update core data in the background.
dispatch_async(private_queue,^{
[CoreDataInitializer initialize];
});
Initially, when savePrivateThreadMOCToCoreData was doing saves in a -performBlock, I was seeing the same psynch_mutex deadlocks described in "Core Data Growing Pains" linked above. I also saw crashes if I tried reading data into the TableVC while the save was in progress.
Collection <__NSCFSet: 0x7d8ea90> was mutated while being enumerated.
To overcome these, I switched to doing saves using -performBlockAndWait. I stopped seeing deadlocks and crashes but it didn't feel right to make the UI wait for saves. Finally, I removed all calls to -performBlock* and used a plain vanilla [privateMOC save:&error] and just like that, all my issues disappeared. The fetched results controller reads partially saved data cleanly and updates the table, no more deadlocks or "mutated while being enumerated" errors.
I suspect -performBlock* is supposed to be used by other threads, ones which didn't create the MOC in question, to request operations on it. Since both my private and main thread MOCs belong to the app delegate, saves on the private MOC should not use -performBlock*.
It's probably relevant that though my build environment is iOS 6, my base deployment target SDK iOS 5.0. Seems others aren't seeing this issue with iOS 6 any more.