Можно ли подключить несколько экземпляров NSPersistentStoreCoordinator к одному постоянному хранилищу SQLite? - PullRequest
7 голосов
/ 20 января 2011

Все, что я читал об использовании Core Data в нескольких потоках, говорит об использовании нескольких NSManagedObjectContext экземпляров, совместно использующих один NSPersistentStoreCoordinator. Это понятно, и я заставил его работать в приложении, которое использует базовые данные в основном потоке для поддержки пользовательского интерфейса и имеет операцию фоновой выборки, которая может занять некоторое время.

Проблема заключается в том, что доступ к базовому постоянному хранилищу SQLite сериализуется NSPersistentStoreCoordinator, поэтому все еще бывают случаи, когда пользовательский интерфейс блокируется операцией фонового извлечения.

Операция фонового извлечения никогда не обновит данные, а только прочитает их. Могу ли я установить полностью параллельный стек Core Data (NSManagedObjectContext, NSManagedPersistentStoreCoordinator и NSManagedObjectModel) в фоновом потоке, подключенном к тому же базовому постоянному хранилищу SQLite? Кажется, что это даст полный параллелизм между потоком пользовательского интерфейса и операцией фонового извлечения.

1 Ответ

7 голосов
/ 20 января 2011

Мой предварительный ответ на этот вопрос теперь да .

Я инициализирую фоновую операцию, передав ей экземпляр NSPersistentStore.В фоновом потоке свойства этого хранилища, включая URL-адрес, используются для создания целого нового стека базовых данных, например:

    //  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экземпляр.

Кажется, все работает нормально.Однако я пока не принимаю свой собственный ответ, так как хотел бы, чтобы кто-то предоставил подтверждающие или противоречащие доказательства моим выводам.

...