Я новичок в данных Core и все еще разбираюсь в гайках и болтах, и эта ошибка вызывает у меня часами, и я не могу найти решение. Любая помощь приветствуется.
Проблема такая:
У меня есть два представления, которые извлекают данные с сервера и обновляют пользовательский интерфейс. Я создал поток таким образом
view1 → Отправить HTTP Req с сервера - Получить обратный вызов → Сохранить данные в Coredata → Чтение из основных данных и отображение в пользовательском интерфейсе (обратный вызов и сохранение/чтение Coredata происходят в ViewController)
view2 → Отправить HTTP Req с сервера - Получить обратный вызов → Сохранить данные в Coredata → Чтение из основных данных и отображение в пользовательском интерфейсе (обратный вызов и сохранение/чтение Coredata происходят в ViewController)
Просмотр 2 повторяет этот процесс каждые 3 секунды, поскольку это автоматический экран обновления.
Проблема заключается в том, что всякий раз, когда я пытаюсь переключаться между представлениями 1 и 2 очень быстро, это приводит к сбою приложения с ошибкой выше. Если я ожидаю несколько секунд в каждом представлении (дождаться получения данных с сервера), он отлично работает. Я что-то не так, что мне нужно изменить?
- (void) refreshData {
[super refreshData];
[[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}
- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
[self saveToCoreData: responseOperation.responseArray];
NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
[self setData: tmp];
[tmp release];
[self.tableView reloadData];
return YES;
}
- (void) saveToCoreData:(NSArray *) responseArray{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];
for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}
for (int i=0; i<[responseArray count]; i++) {
CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
coreView_.id = [[responseArray objectAtIndex:i] id];
[self.managedObjectContext insertObject:coreView1_];
}
[self saveContext:self.managedObjectContext];
}
- (NSArray *) readFromCoreData{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
[fetchRequest release];
return [fetchedObjects autorelease];
}
Это пример кода, который я использую, даже View2 имеет те же обратные вызовы и следует за тем же потоком.
Изменить 1 Забыл упомянуть об этом ранее, я всегда получаю ошибку в методе saveToCoreData. Кроме того, еще одно замечание: если я удалю код для удаления объектов, все работает отлично (мне нужно удалить все существующие данные из таблицы, прежде чем сохранять обновленные данные). Не уверен, что происходит, хотя.