Я думаю, что понимаю сообщение об ошибке: CoreData не может выполнить ошибку, но я не уверен, как мне с ней бороться.
У нас есть приложение, в котором мы используем Core Data для сохранения данных, возвращаемых службой JSON. Сегодня я делаю следующее.
Проблема; даже если я не использую многопоточность, я иногда получаю сообщение об ошибке, когда 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 для выборки, я получаю исключение. Это выглядит многообещающе, но я боюсь, что на более позднем этапе у меня возникнут проблемы. Рано или поздно я, вероятно, попытаюсь получить доступ к свойству, которое не получено полностью (ошибка). Как мне добиться желаемого поведения?