gpt4 book ai didi

objective-c - 如何在 NSPersistentDocument 中强制创建默认的 persistentStore/autosave

转载 作者:搜寻专家 更新时间:2023-10-30 20:10:03 26 4
gpt4 key购买 nike

我有一个使用 CoreData 的基于文档的 Cocoa 应用程序,它可以导入大量数据。由于此导入需要一些时间,所以我在后台进行,但由于 NSManagedObjectContext 不是线程保存,所以我使用了 managedObjectContextpersistentStoreCoordinator文档在后台线程中创建一个新的 NSManagedObjectContext。现在,当导入完成后,我保存后台 managedObjectContext 以将更改通知文档的主线程 managedObjectContext 并合并它们。据我了解,这就是应该如何使用 CoreData 进行并发。

但有时,当我调用 [managedObjectContex save:] 时,persistentStoreCoordinator 没有 persistentStore,这会导致保存失败,应用程序崩溃。我正在使用自动保存和所有功能(基本上是 OS X 10.8 上几乎未修改的 NSPersistentDocument),所以我认为我不必关心它是如何保存的,它会“正常工作”。

显然,事实并非如此。我尝试强制执行自动保存操作,希望这会通过调用 [self autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];windowControllerDidLoadNib: 在我的文档子类中,但这似乎并没有改变任何东西。委托(delegate)回调 (- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo) 实际上表明自动保存成功,尽管 fileURL 或相关的都没有访问器返回非 nil 的东西,也没有创建 persistentStore。

我还考虑过调用 -(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError *__autoreleasing * )error 我自己,但我不知道要使用什么 URL 才能使它的行为就像普通的自动保存一样。我检查了 backupFileURLfileURLautosavedContentsFileURL,但它们在 windowControllerDidLoadNib: 的末尾仍然为零。事实上,在调用 writeToURL:...configurePersistentStoreCoordinatorForURL:... 之后它们甚至为零,所以我不知道如何获取“正确”的 URL。

为了更好地了解如何以及何时创建 persistentStore ,我在 writeToURL:...configurePersistentStoreCoordinatorForURL:... 中设置了断点.我注意到 configurePersistentStoreCoordinatorForURL: 在应用程序失去最前端状态时被调用。但是,当我刚刚创建一个新文档并尝试在创建后立即导入某些内容时(没有先切换到另一个应用程序来创建 persistentStore),它崩溃了。如果我切换到另一个应用程序,则会创建商店并且一切正常。顺便说一句,用于以这种方式创建的 persistentStore 的 URL 始终位于临时目录中的某个位置。

我做错了什么吗?我不必调用 [managedObjectContext save:] 来通知其他 managedObjectContext 更改吗?我怎样才能强制文档创建它的临时 persistentStore?为什么对 autosaveDocumentWithDelegate:... 的调用实际上没有保存文档(并因此创建了一个 persistentStore)?

相关:

最佳答案

我解决了一个类似的问题:我需要生成永久对象 ID,这需要存在持久存储。正如您所指出的,尚未自动保存的无标题文档没有持久存储。

这个缩写片段来 self 的 NSWindowController 子类:

- (void) awakeFromNib {
//hacky way to get an autosave to generate an NSPersistentStore.
GSNativeDocument *doc = self.document;
[doc updateChangeCount:NSChangeDone];
[doc autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];
}

//called by the autosave operation started in awakeFromNib.
- (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo
{
GSNativeDocument *doc = self.document;
[doc updateChangeCount:NSChangeUndone];
}

为什么更新更改计数会创建一个“真正的”自动保存,而其他所有引起自动保存的方法都不会?我没有任何线索。我已于 1 月初向 Apple 提交此错误并在开发论坛上发布,但他们没有回复。

关于objective-c - 如何在 NSPersistentDocument 中强制创建默认的 persistentStore/autosave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257287/

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