gpt4 book ai didi

ios - 使用 saveToURL :forSaveOperation:completionHandler: 自动删除 UIManagedDocument 文件

转载 作者:行者123 更新时间:2023-11-29 12:44:41 25 4
gpt4 key购买 nike

我将 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];
}
}

CreateManagedDocument 在init 方法中被调用。我有两种保存方法。一种用于创建,另一种用于覆盖。第一个是在我创建托管文档时调用的。

此时,我只保存了一次,UIManagedDocument 目录和持久存储文件存在于我的文档文件夹中。

当我想插入一个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:”后,我的管理文档目录和我的Documents文件夹中的文件都被自动删除了。 managedObjectContext、Item 对象和 managedDocument 对象此时都有效。文档的 URL 指向正确的目的地,但所有文件都不见了。

在我的“insertManagedObject”方法完成后,我使用导航 Controller 弹出回到 rootViewController,其中包含一个列出项目的 TableView 。我添加的数据保存在内存中,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);
}

}];

关于ios - 使用 saveToURL :forSaveOperation:completionHandler: 自动删除 UIManagedDocument 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23944075/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com