Вы написали установщик для вашего управляемогоObjectContext, но он ничего не делает:
- (void) setManagedObjectContext:(NSManagedObjectContext *)managedObjectContext{}
Когда вы делаете self.managedObjectContext = nil
, все, что он делает, это вызывает [self setManagedObjectContext:nil]
.Это ничего не делает.Переменная экземпляра managedObjectContext сохраняет то же значение, и когда вы запрашиваете его снова с помощью получателя, у вас все еще есть файл managedObjectContext, связанный с удаленным файлом.Вам необходимо:
- (void) setManagedObjectContext:(NSManagedObjectContext *)_managedObjectContext {
[managedObjectContext release];
managedObjectContext = _managedObjectContext;
[managedObjectContext retain];
}
И это также при условии, что ваше свойство managedObjectContext объявлено с неатомарным модификатором.Если он объявлен как атомарный, вам также понадобится код для блокировки.Напишите сеттеры для managedObjectModel и persistentStoreCoordinator аналогичным образом.
@ synthesize обычно генерирует такие сеттеры для вас, но, так как вы хотите писать свои собственные геттеры, вы должны написать свои собственные сеттеры.Может быть, есть способ заставить @synthesize сделать только установщик для вашего свойства, но я не могу вспомнить.
Ответ на следующий вопрос.Может быть, вы делаете что-то вроде этого:
NSManagedObjectContext *moc = self.managedObjectContext;
[self reset];
[self repopulateData:xmlFile];
NSError *error = nil;
if (![moc save:&error])
[self logError:error];
Если это так, то вы вызываете save в старом контексте управляемого объекта.Не уверен, каков будет результат этого.Вместо этого измените строку с последней на последнюю на
if (![self.managedObjectContext save:&error])
, чтобы убедиться, что вы используете текущий контекст управляемого объекта.
Или аналогичным образом вы можете пытаться читать со старого управляемого объектаконтекст.Проверьте адреса любых указателей контекста управляемого объекта, которые вы используете, и убедитесь, что они указывают на то же самое, что и новый контекст управляемого объекта, который вы создали при сбросе.
Если это не проблема, я понятия не имею.Вам нужно будет попытаться собрать больше информации о том, почему это не работает.Например, существует ли файл вообще?Увеличивается ли его размер при добавлении данных?Данные записаны в файл, но не могут быть прочитаны?