ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

我读过的关于在多个线程上使用Core Data的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedObjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用Core Data来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.

问题是NSPersistentStoreCoordinator会对基础SQLite持久性存储的访问进行序列化,因此仍然存在背景提取操作阻止UI的情况.

后台提取操作永远不会更新数据,只能从中读取数据.我可以在连接到相同底层SQLite持久性存储的后台线程上设置完全并行的Core Data堆栈(NSManagedObjectContext,NSManagedPersistentStoreCoordinator和NSManagedObjectModel)吗?看起来这样可以在UI线程和后台获取操作之间提供完全的并发性.

解决方法

我现在的尝试性答案现在是肯定的.

我通过传递NSPersistentStore实例初始化我的后台操作.在后台线程中,此存储的属性(包括URL)用于创建一个全新的Core Data堆栈,如下所示:

//  create managed object model
    NSURL *modelUrl = [[NSBundle bundleForClass:[self class]] URLForResource:@"..." withExtension:@"..."];
    NSManagedObjectModel *managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelUrl];

    //  create persistent store coordinator
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:managedObjectModel];
    NSError *error = nil;
    [persistentStoreCoordinator addPersistentStoreWithType:[store type]
                                            configuration:[store configurationName]
                                                      URL:[store URL]
                                                   options:[store options]
                                                     error:&error];

    //  create managed object context
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:persistentStoreCoordinator];
    [persistentStoreCoordinator release];
    [managedObjectModel release];

然后,我使用这个新创建的NSManagedObjectContext实例执行后台提取.

一切似乎都很好.不过,我还没有接受我自己的答案,因为我希望有人能为我的调查结果提供支持或反对的证据.

相关文章

当我们远离最新的 iOS 16 更新版本时,我们听到了困扰 Apple...
欧版/美版 特别说一下,美版选错了 可能会永久丧失4G,不过只...
一般在接外包的时候, 通常第三方需要安装你的app进行测...
前言为了让更多的人永远记住12月13日,各大厂都在这一天将应...