iOS: метод класса Core Data - PullRequest
       3

iOS: метод класса Core Data

0 голосов
/ 24 февраля 2012

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

Также, если я использую Core Data с dispatch_async, я знаю, что мне нужно создать свой собственный экземпляр managedObjectContext, но я могу использовать тот же координатор. Сделает ли это информацию доступной как внутри dispatch_async, так и в основном потоке?

Я в основном использую dispatch_async, чтобы получать данные из API и сохранять их, пока пользователь использует приложение.

Ответы [ 3 ]

1 голос
/ 24 февраля 2012

В прошлом я создавал одноэлементный класс Core Data Manager, который упрощал работу. Вот пример , но это предварительная версия iOS5 / ARC, поэтому необходимо внести некоторые изменения.

0 голосов
/ 24 февраля 2012

Имея дело только с первой частью вопроса (вам не следует задавать несколько вопросов!), Вам не нужно передавать контекст управляемого объекта - возможно, вы передаете управляемый объект?В этом случае контекст доступен как свойство самого управляемого объекта - .managedObjectContext.

0 голосов
/ 24 февраля 2012

У меня была похожая проблема при попытке асинхронной передачи данных с моего сервера в приложение. Мой метод немного другой, но в основном он здесь (это проект 4.3, поэтому нет ARC):

Следующие методы находятся в моем синглтоне DataUpdater. Этот первый метод вызывается при запуске приложения:

- (void) update { //download the updates on a new thread

  [NSThread detachNewThreadSelector:@selector(updateThread) 
                           toTarget:self withObject:nil]; 

}

Он инициализирует поток с этим селектором, который отвечает только за загрузку контента из API, а затем передает его обратно в основной поток для сохранения.

- (void) updateThread { //the actual update thread

  //New thread, new auto-release pool 
  //(dunno if you need to do anything fancy for ARC)
  NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

  //... 
  //YOUR CODE TO DOWNLOAD (BUT *NOT* SAVE) DATA FROM THE SERVER
  //DON'T CREATE ANY MANAGED OBJECTS HERE
  //...

  //Pass the data to the main thread to perform 
  //the commit to the Core Data Model
  [self performSelectorOnMainThread:@selector(saveUpdate:) 
                         withObject:data waitUntilDone:NO];

  //kill the thread & the auto-release pool
  [NSThread exit];
  [pool release];
}

Теперь, когда мы вернулись в основной поток, данные добавляются в Базовую модель данных, а затем контекст сохраняется.

- (void) saveUpdate:(NSArray *) data {

  //add the objects to your Core Data Model

  //and save context
  NSError * error = nil;
  [[[CoreManager defaultCoreManager] CoreContext] save:&error];
  if (error) {
    [NSException raise:@"Unable to save data update" 
                format:@"Reason: %@", [error localizedDescription]];
  } else {
    [[NSNotificationCenter defaultCenter] postNotification:
      [NSNotification notificationWithName:@"DONE" object:nil]];
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...