3

当我尝试将新创建的 UIManagedDocument 保存到 iCloud 并且网络关闭(例如飞行模式)时,我收到以下错误并崩溃(删除了十六进制代码和不可读的内容):

-[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仍在尝试添加其数据存储,或者只是未能这样做,因为没有网络连接。这不是它应该如何工作的,但通常会出现故障或长时间延迟让 iCloud 启动并与 Core Data 一起运行。最坏的情况应该是 - 正如您所期望的那样 - 您的完成块将被调用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
}

不过,这有点像 hack,它并不能帮助您实际保存文档。另外,不能保证文档在以后的某个时间可以保存。不过,它可以避免崩溃。

一般来说,Core Data 加 iCloud 并不是最可靠的组合。我询问了 iOS 版本,因为 iOS 6.x 比 iOS 5 差。由于你已经在 6 上,我不能建议移动到 6 以希望更好的行为。

于 2013-03-01T19:20:10.633 回答