Эта модель, кажется, работает для меня, но я не видел окончательного доказательства того, что она полностью законна. В моем случае фоновые темы в основном читаются, но иногда пишут (после загрузки данных с веб-сайта).

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

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

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

Ответы на вопрос(1)

Решение Вопроса

да.

Я инициализирую свою фоновую операцию, передавая ей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 экземпляр.

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

 Gian Franco Zabarino17 нояб. 2015 г., 19:35
Как я понимаю, SQLite поддерживает несколько одновременных читателей и одного писателя. Каждый NSPersistentStoreCoordinator будет тогда читателем, так что это вполне возможно.
 jasongregori03 июн. 2011 г., 21:23
Привет, ГБ, у тебя все еще работает нормально? Мне нужно сделать что-то подобное, но я не нахожу никаких ответов в Интернете.
 GBegen07 июл. 2011 г., 01:22
До сих пор у меня не было проблем с этим методом.
 Trygve22 июл. 2018 г., 20:30
Эта модель, кажется, работает для меня, но я не видел окончательного доказательства того, что она полностью законна. В моем случае фоновые темы в основном читаются, но иногда пишут (после загрузки данных с веб-сайта).

Ваш ответ на вопрос