我是核心数据的新手,仍在弄清楚具体细节,这个错误已经困扰我几个小时了,我似乎找不到解决方案。任何帮助是极大的赞赏。
问题是这样的
我有两个视图,它们从服务器获取数据并更新 UI。我已经这样设置流程了
view1 -> 从服务器发送 HTTP Req - 接收回调 -> 将数据保存到 Coredata -> 从 Core Data 读取并显示在 UI 上(回调和保存/读取 Coredata 发生在 ViewController 中)
view2 -> 从服务器发送 HTTP Req - 接收回调 -> 将数据保存到 Coredata -> 从 Core Data 读取并显示在 UI 上(回调和保存/读取 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 也具有相同的回调并遵循相同的流程。
Edit 1忘记之前提到这一点,我总是在 saveToCoreData 方法中遇到错误。另外,还要注意的一件事是,如果我删除删除对象的代码,一切都会正常工作(在保存更新的数据之前,我需要从表中删除所有现有数据)。但不确定发生了什么。
删除删除代码使其起作用的原因是,您要删除持久存储中的数据,而无需更新仍具有与内存中该数据相关联的托管对象实例的其他视图。请记住,虽然 Core Data 处理对象,但每个对象后面都必须在数据库中有一行。当您删除该行时,核心数据会生气。
因此,要解决此问题并仍然删除您的数据,您应该听取您的意见NSManagedObjectContextWillSaveNotification
and/or NSManagedObjectContextDidSaveNotification
通知并使用商店中最新版本的数据更新您的视图。此时,您应该丢弃视图所持有的任何 Core Data 对象,并从存储中重新加载它们。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)