CoreData не может выполнить ошибку, когда объекты обновляются службой HTTP

Я думаю, что понимаю сообщение об ошибке: CoreData не может выполнить ошибку, но я не уверен, как мне с ней бороться.

У нас есть приложение, в котором мы используем Core Data для сохранения данных, возвращаемых службой JSON. Сегодня я делаю следующее.

  1. Получить локальный объект из постоянного хранилища и вернуться в пользовательский интерфейс
  2. Спрашивать сервер, обновлен ли объект - когда я получаю ответ, я обновляю управляемый объект Core Data
  3. Обновляю пользовательский интерфейс с помощью обновленный объект

Проблема; даже если я не использую многопоточность, я иногда получаю сообщение об ошибке, когда HTTP-запрос удаляет управляемые объекты, которые сохранил мой пользовательский интерфейс. Я попытался получить объекты с помощью returnObjectsAsFaults в NO. Я думал, что тогда я смогу получить доступ ко всем отношениям и свойствам управляемого объекта, даже если он был удален (при условии, что мой интерфейс сохранил его).

Как мне решить эту проблему?

Я подумал, что могу использовать отдельные NSManagedObjectContext для чтения и записи. Я сделал этот тест:

MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"Hans@somedomain.no";

NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];

NSError *error = nil;
[updateContext save:&error];

NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];

NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"Hans@somedomain.no" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];

NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];

MyAuthorMO * readAuthor = [authors objectAtIndex:0];

// Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];

NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);

Журнал выводится нормально, пока я использую readContext для выборки. Если я использую updateContext для выборки, я получаю исключение. Это выглядит многообещающе, но я боюсь, что на более позднем этапе у меня возникнут проблемы. Рано или поздно я, вероятно, попытаюсь получить доступ к свойству, которое не получено полностью (ошибка). Как мне добиться желаемого поведения?

6
задан Andi 9 September 2010 в 22:06
поделиться