I'm trying to use core data in a multi thread way. I simply want to show the application with the previously downloaded data while downloading new data in background. This should let the user access the application during update process.
I have a NSURLConnection which download the file asyncronously using delegate (and showing the progress), then i use an XMLParser to parse the new data and create new NSManagedObjects in a separate context, with its own persistentStore and using a separate thread.
The problem is that creating new objects in the same context of the old one while showing it can throws BAD_INSTRUCTION exception. So, I decided to use a separate context for the new data, but I can't figure out a way to move all the objects to the other context once finished.
Paolo aka SlowTree
The Apple Concurrency with Core Data documentation is the place to start. Read it really carefully... I was bitten many times by my misunderstandings!
Basic rules are:
NSPersistentStoreCoordinator
per program. You don't need them per thread.NSManagedObjectContext
per thread.NSManagedObject
on a thread to the other thread.-objectID
and pass it to the other thread.More rules:
NSManagedObjectContext
's -mergeChangesFromContextDidSaveNotification:
is helpful. But let me repeat, please read the document carefully! It's really worth it!