Core Data multi thread application
core-data, ios, iphone, multithreading
Solution
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:
- Use one `NSPersistentStoreCoordinator` per program. You don't need them per thread.
- Create one `NSManagedObjectContext` per thread.
- Never pass an `NSManagedObject` on a thread to the other thread.
- Instead, get the object IDs via `-objectID` and pass it to the other thread.
More rules:
- Make sure you save the object into the store before getting the object ID. Until saved, they're temporary, and you can't access them from another thread.
- And beware of the merge policies if you make changes to the managed objects from more than one thread.
- `NSManagedObjectContext`'s `-mergeChangesFromContextDidSaveNotification:` is helpful.
But let me repeat, please read the document carefully! It's really worth it!
Problem
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