Я новичок в Core data и все еще разбираюсь в тонкостях, и эта ошибка мучила меня часами, и я не могу найти решение. Приветствуется любая помощь.
Проблема такая.
У меня есть два представления, которые извлекают данные с сервера и обновляют пользовательский интерфейс. Я настроил поток таким образом
view1 -> Отправить HTTP Req с сервера - Получить обратный вызов -> Сохранить данные в Coredata -> Чтение из основных данных и отображение в пользовательском интерфейсе (обратный вызов и сохранение / чтение Coredata происходят в ViewController)
view2 -> Отправить HTTP-запрос с сервера - Получить обратный вызов -> Сохранить данные в Coredata -> Прочитать из основных данных и отобразить на Пользовательский интерфейс (обратный вызов и сохранение / чтение Coredata происходят в ViewController)
View 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 имеет те же обратные вызовы и следует тому же процессу.
Edit 1 Отправить HTTP Req с сервера - Получить обратный вызов -> Сохранить данные в Coredata -> Прочитать из основных данных и отобразить в пользовательском интерфейсе (обратный вызов и сохранение / чтение Coredata происходят в ViewController)
View 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 имеет те же обратные вызовы и следует тому же процессу.
Edit 1 Отправить HTTP Req с сервера - Получить обратный вызов -> Сохранить данные в Coredata -> Прочитать из основных данных и отобразить в пользовательском интерфейсе (обратный вызов и сохранение / чтение Coredata происходят в ViewController)
View 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 имеет те же обратные вызовы и следует тому же процессу.
Edit 1 Чтение из основных данных и отображение в пользовательском интерфейсе (обратный вызов и сохранение / чтение Coredata происходит в ViewController)
View 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 имеет те же обратные вызовы и следует тому же процессу.
Edit 1 Чтение из основных данных и отображение в пользовательском интерфейсе (обратный вызов и сохранение / чтение Coredata происходит в ViewController)
View 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 имеет те же обратные вызовы и следует тому же процессу.
Edit 1 Забыл упомянуть об этом раньше, я всегда получаю ошибку в методе saveToCoreData. Также следует отметить еще одну вещь: если я удалю код для удаления объектов, все будет работать нормально (мне нужно удалить все существующие данные из таблицы, прежде чем я сохраню обновленные данные). Хотя не знаю, что происходит.