![](/img/trans.png)
[英]Saving to iCloud with saveToURL:forSaveOperation: completionHandler: fails
[英]UIManagedDocument file being automatically deleted with saveToURL:forSaveOperation:completionHandler:
我將Core Data與UIManagedDocument一起用於庫存管理應用程序。 我遇到的問題是,在將項目添加到核心數據后使用UIDocumentSaveForOverwriting保存時,“ saveToURL:...”方法實際上正在刪除我的Documents目錄中的UIManagedDocument文件。 這僅在從新版本首次啟動時發生。 我創建了一個核心數據/ UIManagedDocument幫助器單例,以在整個應用程序中使用。
這是我初始化UIManagedDocument實例的方法:
@interface VDFCoreDataHelper : NSObject
@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) UIManagedDocument *managedDocument;
@implementation VDFCoreDataHelper
- (void)createManagedDocument
{
NSURL *docsURL = [self getDocsURL];
if (![[NSFileManager defaultManager] fileExistsAtPath:[docsURL path]]) {
NSLog(@"new doc made");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self saveManagedDocumentForCreation];
[self openManagedDocument];
} else {
NSLog(@"existing doc");
_managedDocument = [[UIManagedDocument alloc] initWithFileURL:docsURL];
[self openManagedDocument];
}
}
在init方法中調用CreateManagedDocument。 我有兩種保存方法。 一種用於創建,一種用於覆蓋。 創建托管文檔時,第一個被調用。
至此,我只保存了一次,並且UIManagedDocument目錄和持久性存儲文件位於我的documents文件夾中。
當我要插入Item對象(存在Item實體)時,我調用此方法:
- (void)insertManagedObject:(NSManagedObject *)object success:(void (^)(BOOL successful))successBlock
{
NSManagedObjectContext *context = [self context];
[context insertObject:object];
NSError *error;
[context save:&error];
if (self.managedDocument.documentState == UIDocumentStateNormal) {
[self.managedDocument saveToURL:[self getDocsURL] forSaveOperation:UIDocumentSaveForOverwriting completionHandler:^(BOOL success){
successBlock(success);
}];
}
}
調用“ saveToURL:forSaveOperation:”進行覆蓋后,我的受管理文檔目錄和“文檔”文件夾中的文件將全部自動刪除。 此時,managedObjectContext,Item對象和managedDocument對象均有效。 文檔的URL指向正確的目的地,但是所有文件都消失了。
完成“ insertManagedObject”方法后,我將使用導航控制器彈出到rootViewController,其中包含一個列出項目的表格視圖。 我添加的數據保留在內存中,並且fetchedResultsController加載該數據,但是由於不再存在持久性存儲,因此該數據未保存到磁盤。 當我退出應用程序並重新輸入時,什么都沒有顯示,並且再次創建了一個新的托管文檔。
僅當我清除構建並首次啟動它時,才會發生這種情況。 如果我啟動並立即退出,然后再次進入該應用程序,則一切正常。 這是刪除我的永久存儲的“ saveToURL:...:”方法。
我嘗試將UIManagedDocument子類化並記錄錯誤,但是它什么也沒有顯示。 我嘗試注釋掉一些代碼,但是它們沒有任何區別。
如果我不使用“ saveToURL”,則不會刪除持久性存儲,但是在重新啟動后,fetchResultsController.fetchObjects將返回一個空數組,並嘗試訪問不存在的indexPath,從而使應用程序崩潰。
我現在正在考慮放棄UIManagedDocument。 希望有人可以告訴我我可能做錯了什么,或者遇到了同樣的問題。
謝謝。
我正在為與您完全相同的問題而苦苦掙扎。 但是沒有找到任何幫助...
沒有任何錯誤的刪除部分使我發瘋,並且我幾乎放棄了UIManagedDocument。
但是我做了一些實際可行的工作!
實際上,我認為問題是在創建文檔后嘗試訪問文檔,並調用選擇器:
[_document saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {}];
然后,我所做的就是在保存文檔后關閉它,獲取一個新的實例,然后重新打開它。 像這樣:
[_coreDocument saveToURL:self.documentURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
if (success) {
NSLog(@"Document created");
[_coreDocument closeWithCompletionHandler:^(BOOL success) {
if (success) {
NSLog(@"Closed recently created document, will open it again");
_coreDocument = nil;
_coreDocument = [[CheckinManagedDocument alloc] initWithFileURL:self.documentURL];
[_coreDocument openWithCompletionHandler:^(BOOL success) {
NSLog(@"Document oppened afer creating and closing it");
[self documentIsReadyForUse];
}];
}
}];
} else {
NSLog(@"Could not save the document at path: %@", self.documentURL.path);
}
}];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.