在 View Controller (选项卡 1)中,我从核心数据加载如下:
- (void)loadRecordsFromCoreData {
[self.managedObjectContext performBlockAndWait:^{
NSError *error = nil;
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName"Item"];
[request setSortDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey"order" ascending:YES]]];
self.items = [self.managedObjectContext executeFetchRequest:request error:&error];
}];
}
然后我显示这样的项目(在 viewDidAppear 中):
- (void)displayItems
{
for(UIView *subview in [self.itemRow subviews]) {
[subview removeFromSuperview];
}
int xPos = kXItemOffsetIphone;
for (Item *item in self.items) {
ItemView *itemView = [[ItemView alloc] initWithFrame:CGRectMake(xPos, kYItemOffsetIphone, kItemWidthIphone, kItemHeightIphone) ];
[itemView layoutWithData:item];
[self.itemRow addSubview:itemView];
xPos += kXItemSpacingIphone;
}
}
ItemView 是 UIView 子类,用于显示与项目相关联的图像等。
当我第一次运行该应用程序时,会显示所有项目。但是,如果我单击另一个选项卡,然后返回选项卡 1,我的所有项目都会消失。项目数组仍然存在,但数组中的每个项目都是“故障”,因此没有显示任何内容。非常令人沮丧。如何防止这些项目成为“故障”?
Best Answer-推荐答案 strong>
听起来您的 NSManagedObjectContext 正在被释放(也许当您切换选项卡时您的 View Controller 正在卸载/清理自己?)。
在幕后,您的对象只是数据进出 SQLite 存储以及在 NSManagedObjectContext 管理的缓存之间移动的代理。当上下文被释放时,代理对象仍然存在(因此你的数组仍然充满对象)但是它们无法向释放的托管对象上下文询问数据并且它们的所有值都恢复为错误。
你有几个选择:
您可以在 Controller 之间移动时传递对 NSManagedObjectContext 的引用,以免丢失它。
您可以在 -viewWillAppear: 或您认为每次显示 View 时触发的另一种方便的方法中重新获取您的数据。
您还可以将 NSManagedObjectContext 移动到在应用程序的整个生命周期中都存在的单例对象,但是如果您不小心,它可能会变得脆弱。
关于ios - 核心数据故障挫折,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/12379462/
|