Я думаю, что я понимаю сообщение об ошибке: CoreData не смог выполнить ошибку, но я не уверен, как мне с этим справиться.CoreData не смог выполнить ошибку при обновлении объектов службой HTTP
У нас есть приложение, в котором мы используем Core Data для сохранения данных, возвращаемых службой JSON. Сегодня я делаю следующее.
- Fetch локального объекта из постоянного хранилища и вернуться к UI
- Задать сервер, если объект обновляется - когда я получаю ответ, я обновить ядро данные управляемого объекта
- обновление пользовательского интерфейс с обновленным объектом
проблема; даже если я не использую несколько потоков, я иногда получаю сообщение об ошибке, когда 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 = @"[email protected]";
NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];
NSError *error = nil;
[updateContext save:&error];
NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];
NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"[email protected]" 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 для извлечения, я получаю исключение. Это выглядит многообещающе, но я боюсь, что у меня возникнут проблемы на более позднем этапе. Рано или поздно я, вероятно, попытаюсь получить доступ к объекту, который полностью не получен (ошибка). Как я могу достичь такого поведения, которое я ищу?
Ник, вы, вероятно, правы. Я прочитал свои предыдущие сообщения и принял лучшие решения. Спасибо за ваш комментарий. – Andi