2011-01-19 2 views
7

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

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

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

ответ

6

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

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

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

+0

Hi GB, это все еще отлично работает для вас? Мне нужно сделать что-то подобное, но я не нахожу ответов в Интернете. – jasongregori

+0

У меня до сих пор не было проблем с этим методом. – GBegen

+0

Как я понимаю, SQLite поддерживает несколько одновременных считывателей и один писатель. Каждый NSPsistentStoreCoordinator будет тогда читателем, так что это совершенно возможно. –

Смежные вопросы