UIManagedDocument: Erreur / blocage lors de la création de nouveaux files lorsque le réseau est arrêté (logging)

Lorsque j'essaie d'save un UIManagedDocument nouvellement créé dans iCloud et que le réseau est en panne (par exemple, en mode avion), j'obtiens les erreurs suivantes avec un crash (hexcodes et éléments illisibles supprimés):

-[PFUbiquitySafeSaveFile waitForFileToUpload:](272): CoreData: Ubiquity: <PFUbiquityPeerReceipt: ...>(0) permanentLocation: <PFUbiquityLocation: ...>: /private/var/mobile/Library/Mobile Documents/XXXXXXXXXX~com~domain~AppName/TransactionLog/mobile.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/DocumentName/XXXXXXXXXXXXXXX/receipt.0.cdt safeLocation: <PFUbiquityLocation: ...>: /private/var/mobile/Library/Mobile Documents/XXXXXXXXXX~com~domain~AppName/TransactionLog/mobile.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/DocumentName/XXXXXXXXXXXXXXX/mobile.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.0.cdt currentLocation: <PFUbiquityLocation: ...>: /private/var/mobile/Library/Mobile Documents/XXXXXXXXXX~com~domain~AppName/TransactionLog/mobile.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX/DocumentName/XXXXXXXXXXXXXXX/mobile.XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX.0.cdt kv: (null) Safe save failed for file, error: Error Domain=NSCocoaErrorDomain Code=512 "The file upload timed out." UserInfo=... {NSLocalizedDescription=The file upload timed out.} *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.' *** First throw call stack: (...) libc++abi.dylib: terminate called throwing an exception 

Je ne connais pas cette erreur mais il est dit que ce document n'a pas pu être sauvegardé car aucun téléchargement n'est possible (bien sûr, car il n'y a pas de réseau). Mais je ne peux pas comprendre pourquoi je ne peux pas attraper cette erreur avec le gestionnaire d'achèvement de sauvegarde:

 [theDocumentToSave saveToURL:theDocumentToSave.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { if (success) { // Do somethings, go on, ... } else { // Catch error HERE, but this is never called! } }]; 

Ceci représente malheureusement un bug interne dans l'intégration d'iCloud de Core Data. Le UIManagedDocument tente toujours d'append son magasin de données, sinon il a tout simplement échoué, car il n'y a pas de connection réseau. Ce n'est pas comme ça que ça fonctionne, mais il est courant d'avoir des échecs ou de longs timeouts pour qu'iCloud fonctionne avec Core Data. Le pire des cas devrait être – comme vous l'attendiez – que votre bloc d'achèvement soit appelé avec success réglé sur NO . Crashing votre application dans ce scénario n'est pas votre faute, mais cela signifie également que vous pouvez avoir du mal à faire quelque chose à ce sujet.

Vous pourriez être en mesure de prédire ce crash par quelque chose comme:

 NSArray *persistentStores = theDocumentToSave.managedObjectContext.persistentStoreCoordinator.persistentStores; if ([persistentStores count] == 0) { // exception is likely, should be at least 1 } else { // exception probably won't happen } 

C'est un peu un hack, et cela ne vous aide pas à sauvegarder le document. De plus, il n'y a aucune garantie que le document deviendra économisable plus tard. Cela pourrait cependant éviter les accidents.

En général, Core Data plus iCloud n'est pas la plus fiable des combinaisons. J'ai posé des questions sur la version iOS car iOS 6.x est, disons, less mauvais que iOS 5. Puisque vous êtes déjà sur 6, je ne peux pas suggérer de passer à 6 dans l'espoir d'un meilleur comportement.