Search code examples
iphoneobjective-ccore-dataicloud

Core Data & iCloud (iOS5)


After adding a new NSManagedObject to my Core Data store I tried calling:

    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {

and got the following exception (weirdly I had no error and the result was also positive!)

2013-03-15 18:32:09.753 Nick copy[28782:3407] CoreData: Ubiquity: An exception occured during a log file export: NSInternalInconsistencyException save notification contents: NSConcreteNotification 0x3891b0 {name = _NSSQLCoreTransactionStateChangeNotification; object = (URL: file://localhost/var/mobile/Applications/FCAF7FC6-7DC8-4E0B-A114-38778255CA90/Documents/MyApp.sqlite); userInfo = { "_NSSQLCoreActiveSaveRequest" = ""; "_NSSQLCoreTransactionType" = 2; "_NSSQLCoreTransientSequenceNumber" = 1; }}

I can catch all exceptions from the "save" method and the App runs fine. Just wondering if this is really save to do, because it feels totally unsafe.

EDIT: Another exception when trying to delete an Object:

Catched Exception: Failed to process pending changes before save.  The context is still dirty after 100 attempts.  Typically this recursive dirtying is caused by a bad validation method, -willSave, or notification handler.

Solution

  • Unfortunately I can't find the thread anymore, but it told me I had to make sure to always use NSManagedObject classes only in the thread/dispatch_queue in which they are created.

    The problem is, if you do access it from a different queue, it might work or crash after a random interval.

    I made sure I call NSManagedObject from a dedicated dispatch_queue only and have not logged any weird exceptions since then.