2013-10-01 3 views
2

В приложении, над которым я работаю, мне нужно одновременно обращаться к Core Data и записывать его. Я смог понять, что это означает, что мне нужно использовать несколько управляемых объектов, но я не понимаю, как я должен настроить эти два управляемых объектаObjectContexts.Настройка основных данных Несколько управляемых объектовОбъекты

Я понимаю, что как только у меня есть настройка, мне нужно выполнить операции записи в фоновом потоке в управляемом объектеObjectContext, а затем объединить данные с помощью такой операции: Core Data and threads/Grand Central Dispatch.

Итак, мой вопрос в том, как мне начать инициирование двух отдельных управляемых объектов, чтобы я мог их использовать, как описано?

+0

интересный вопрос, зачем вам два MOC? – DogCoffee

+0

Насколько я понимаю, причина в том, что managedObjectContexts не являются потокобезопасными, поэтому вам нужно иметь два для каждого потока, один для простого чтения в основном потоке, а другой - для записи в фоновом потоке. Затем, когда вы закончите писать, вы объедините два, которые делают так, что вы можете выполнять большие задачи в фоновом режиме без остановки взаимодействия с пользователем. – harryisaac

+0

я проверю его. Cheers – DogCoffee

ответ

1

Вы должны создать два отдельных NSManagedObjectContexts с тем же NSPersistentStoreCoordinator, как это,

Сначала нужно создать два NSManagedObjectContexts имя, как backgroundManagedObjectContext и mainBackgroundManagedObjectContext в вашем классе модели, как этот

+ (NSManagedObjectContext *)backgroundManagedObjectContext 
    { 
     static NSManagedObjectContext * backgroundManagedObjectContext; 
     if(backgroundManagedObjectContext != nil){ 
      return backgroundManagedObjectContext; 
     } 
     @try { 
      NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
      if (coordinator != nil) { 
       backgroundManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
       [backgroundManagedObjectContext setPersistentStoreCoordinator: [self persistentStoreCOordinator]]; 
      } 
     } 
     @catch (NSException *exception) { 
      NSLog(@"Exception occur %@",exception); 
     } 
     return backgroundManagedObjectContext; 

    } 

, то оба должны получить тот же persistentStoreCoordinator затем необходимо объединить backgroungManagedObjectContext в mainBackgroundManagedObjectContext, для этого создайте NSNotification всякий раз, когда вы сохраняете данные в backgroundManageObjectContext как этот

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(contextDidSave:) 
               name:NSManagedObjectContextDidSaveNotification 
               object:nil]; 

тогда вы должны реализовать этот способ уведомления для обновления вашего mainManagedObjectContext как этот

- (void)contextDidSave:(NSNotification *)notification 
    { 
     SEL selector = @selector(mergeChangesFromContextDidSaveNotification:); 
     [[self mainManagedObjectContext] performSelectorOnMainThread:selector withObject:notification waitUntilDone:YES]; 

    } 
+0

Удивительный, спасибо! Он отлично работал. – harryisaac

0

Если вы действительно хотите сделать одновременно читает и пишет, вы можете быть заинтересованы в установке, представленной во время WWDC 2013. Он использует два NSPersistentStoreCoordinator, каждый с одним контекстом. Вы объединяете изменения между ними вручную, тем самым достигая хороший, а не код блокировки пользовательского интерфейса.

Это описано в следующих сессий:

  • 207 - Новый What в Core Data (начиная с слайд числа 145).
  • 211 - Core Data Производительность (начиная с слайд числа 91),
Смежные вопросы