我有一个使用 CoreData 的基于文档的 Cocoa 应用程序,它可以导入大量数据。由于此导入需要一些时间,因此我在后台执行此操作,但由于NSManagedObjectContext
不是线程保存,因此我使用文档persistentStoreCoordinator
的of在后台线程中managedObjectContext
创建了一个新线程。NSManagedObjectContext
现在,当导入完成时,我保存背景managedObjectContext
以通知文档的主线程managedObjectContext
更改并合并它们。据我了解,这就是应该使用 CoreData 进行并发的方式。
但有时,当我调用时persistentStoreCoordinator
没有会导致保存失败和应用程序崩溃。我正在使用自动保存和所有(在 OS X 10.8 上基本上是未修改的 NSPersistentDocument),所以我认为我不必关心它是如何保存的,它会“正常工作”。persistentStore
[managedObjectContex save:]
显然,事实并非如此。我尝试强制执行自动保存操作,希望通过在我的文档子类[self autosaveDocumentWithDelegate:self didAutosaveSelector:@selector(document:didAutosave:contextInfo:) contextInfo:nil];
的末尾调用来创建一个 persistentStore windowControllerDidLoadNib:
,但这似乎并没有改变任何东西。委托回调 ( - (void)document:(NSDocument *)document didAutosave:(BOOL)didAutosaveSuccessfully contextInfo:(void *)contextInfo
) 实际上表明自动保存是成功的,尽管任何 fileURL 或相关访问器都没有返回非 nil 的东西,也没有创建持久存储。
我也想过给-(BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url ofType:(NSString *)fileType modelConfiguration:(NSString *)configuration storeOptions:(NSDictionary *)storeOptions error:(NSError *__autoreleasing *)error
自己打电话,但我不知道用什么 URL 让它像普通的自动保存一样。我检查了backupFileURL
,但最后都还是fileURL
nil 。事实上,他们甚至没有被调用,所以我不知道如何获得“正确”的 URL。autosavedContentsFileURL
windowControllerDidLoadNib:
writeToURL:...
configurePersistentStoreCoordinatorForURL:...
为了更好地理解创建持久存储的方式和时间,我在writeToURL:...
和中设置了断点configurePersistentStoreCoordinatorForURL:...
。我注意到configurePersistentStoreCoordinatorForURL:
当应用程序失去最前面的状态时会调用它。但是,当我刚刚创建一个新文档并尝试在创建后立即导入某些内容时(无需先切换到另一个应用程序以导致创建 persistentStore),它就会崩溃。如果我切换到另一个应用程序,则会创建商店并且一切正常。顺便说一句,用于以这种方式创建的 persistentStore 的 URL 始终位于 temp 目录中的某个位置。
难道我做错了什么?我不必调用 [managedObjectContext save:] 来通知其他 managedObjectContext 更改吗?如何强制文档创建其临时持久存储?为什么不调用autosaveDocumentWithDelegate:...
实际保存文档(并因此创建一个persistentStore
)?
有关的:
- 新项目新模型 NSPersistentDocument 这个 NSPersistentStoreCoordinator 没有持久存储类似的问题,但解决方案是不保存上下文或出现错误。我想我必须保存上下文以通知第二个更改,并且不想强迫用户手动保存文件(毕竟,这就是自动保存的目的)。