簡體   English   中英

UIManagedDocument文件通過saveToURL:forSaveOperation:completionHandler自動刪除:

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM