UIManagedDocument: ошибка/сбой при создании новых файлов, когда сеть не работает (сохранение)

Когда я пытаюсь сохранить только что созданный 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!
                 }
}];

person FrankZp    schedule 01.03.2013    source источник
comment
Ошибка произошла на устройстве iPhone 4 под управлением текущей версии iOS 6.1.2.   -  person FrankZp    schedule 01.03.2013


Ответы (1)


К сожалению, это представляет собой внутреннюю ошибку в интеграции Core Data с iCloud. UIManagedDocument все еще пытается добавить свое хранилище данных, или просто не смог этого сделать из-за отсутствия сетевого подключения. Это не так, как это должно работать, но часто случаются сбои или длительные задержки при запуске iCloud с Core Data. В худшем случае, как вы ожидаете, ваш блок завершения будет вызываться с success, установленным в 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, потому что iOS 6.x, скажем так, менее плоха, чем iOS 5. Однако, поскольку вы уже используете 6, я не могу предложить перейти на 6 в надежде на лучшее поведение.

person Tom Harrington    schedule 01.03.2013
comment
Вы были правы насчет AppDelegate.m ...... видимо, если вы делаете это с UIManagedDocument, он вам не нужен в AppDelegate.m, только если вы настроили его автоматически. с основными данными. Кроме того, проверьте свойство persistenceStoreOptions по ссылке: developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/ - person user1066524; 01.03.2013
comment
@Tom: Большое спасибо! Ваш код, кажется, ловит ошибку. Я потрачу некоторое время на тестирование на нескольких устройствах/версиях iOS. И да, это своего рода взлом, и это позор ... Core Data / UIManagedDocument с iCloud кажется таким глючным ... - person FrankZp; 02.03.2013
comment
@Tom: Argh, извините, следующая проблема: этот код вообще препятствует созданию документа. Кажется, что счетчик persistentStores каждый раз при создании равен 0 (даже если режим полета выключен и существует сетевое подключение)... - person FrankZp; 02.03.2013
comment
@FrankZp, жаль это слышать. Поскольку внутренности UIManagedDocument недокументированы, трудно понять, что будет работать. Возможно, лучшее, что вы можете сделать, — это проверить доступность сети (см. демонстрационное приложение Apple Reachability), чтобы повысить шансы. - person Tom Harrington; 02.03.2013
comment
@TomHarrington: Да, я думаю, что это единственный способ точно поймать ошибку. Достаточно ли будет проверить общую доступность в Интернете ([Reachability reachabilityForInternetConnection]) или вы рекомендуете дополнительно проверить конкретный хост iCloud (например, [Reachability reachabilityWithHostName: @"www.icloud.com"])? - person FrankZp; 02.03.2013