核心数据故障挫折

时间:2012-09-11 23:50:55

标签: ios core-data

在视图控制器(选项卡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,我的所有项目都会消失。项目数组仍然存在,但数组中的每个项目都是“错误”,因此不会显示任何内容。很沮丧。如何防止这些物品成为“缺陷”?

1 个答案:

答案 0 :(得分:4)

听起来你的NSManagedObjectContext正在被取消分配(当你切换标签时,你的视图控制器可能正在卸载/自行清理?)。

在幕后,您的对象只是移入和移出SQLite存储的数据以及NSManagedObjectContext管理的缓存之间的代理。取消分配上下文时,代理对象仍然存在(因此您的数组仍然填充了对象),但是他们无法向已释放的托管对象上下文请求数据,并且所有值都会恢复为错误。

您有几个选择:

当您在控制器之间移动时,您可以传递对NSManagedObjectContext的引用,这样您就不会丢失它。

您可以在-viewWillAppear:或其他方法中重新获取数据,您会发现每次显示视图时都会触发该方法。

您还可以将NSManagedObjectContext移动到应用程序生命周期中存在的单个对象,但如果您不小心,这可能会变得脆弱。