3

新しく作成した UIManagedDocument を iCloud に保存しようとしたときに、ネットワークがダウンしている場合 (機内モードなど)、次のエラーが発生し、クラッシュが発生します (16 進コードと読み取り不能なものが削除されます)。

-[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

このエラーはわかりませんが、アップロードできないため (もちろん、ネットワークがないため)、ドキュメントを保存できませんでしたと表示されます。しかし、保存完了ハンドラーでこのエラーをキャッチできない理由がわかりません。

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

1 に答える 1

3

残念ながら、これは Core Data の iCloud 統合の内部バグを表しています。はUIManagedDocumentまだデータ ストアを追加しようとしているか、ネットワーク接続がないために追加できませんでした。これは本来の動作方法ではありませんが、Core Data で iCloud を起動して実行するのに失敗したり、長い遅延が発生したりするのはよくあることです。最悪のケースは、ご想像のとおり、完了ブロックがsuccessset toで呼び出されることNOです。このシナリオでアプリがクラッシュするのはあなたのせいではありませんが、それはまた、それについて何かをするのに苦労するかもしれないことを意味します.

次のような方法で、このクラッシュを予測できる場合があります。

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

ただし、これは一種のハックであり、実際にドキュメントを保存するのには役立ちません。さらに、ドキュメントが後で保存可能になるという保証はありません。ただし、クラッシュは回避できます。

一般に、Core Data と iCloud の組み合わせは、最も信頼できる組み合わせではありません。iOS 6.x は iOS 5 よりも悪くないという理由で、iOS のバージョンについて尋ねました。

于 2013-03-01T19:20:10.633 に答える