- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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,我的所有项目都会消失。项目数组仍然存在,但数组中的每个项目都是一个“错误”,因此不会显示任何内容。非常令人沮丧。如何防止这些项目成为“故障”?
最佳答案
听起来您的 NSManagedObjectContext
正在被释放(也许您的 View Controller 正在卸载/在您切换选项卡时自行清理?)。
在幕后,您的对象只是数据进出 SQLite 存储以及在 NSManagedObjectContext
管理的缓存之间移动的代理。当上下文被解除分配时,代理对象仍然存在(因此你的数组仍然充满对象)但是它们无法向解除分配的托管对象上下文请求数据并且它们的所有值都恢复为错误。
您有几个选择:
您可以在 Controller 之间移动时传递对 NSManagedObjectContext
的引用,这样您就不会丢失它。
您可以在 -viewWillAppear:
中重新获取您的数据,或者在每次显示您的 View 时触发您认为方便的其他方法。
您还可以将 NSManagedObjectContext
移动到在应用程序的生命周期内存在的单例对象,但是如果您不小心,它可能会变得脆弱。
关于ios - 核心数据故障挫折,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12379462/
我一直在努力让 Eclipse 正常工作,但由于某种原因,我无法安装插件、更新,甚至无法访问市场。在进行了一些研究之后,我发现在大多数情况下这是一个代理问题,但我在一个私有(private)家庭网络上
好吧,我知道我一定遗漏了一些明显的东西。这是示例代码(当在 viewDidLoad block 中执行时,它会静静地崩溃......没有错误输出到调试控制台)。 NSMutableArray *bs
我正在尝试替换/删除这个: [\" 从字符串bump3 NSString *bump5 = [bump3 stringByReplacingOccurrencesOfString:@"[\\"" wi
所以我已经花了几个小时来完成我认为会快速简单的项目,但我无法让它工作!这让我很沮丧,哈哈,我必须接近,但也许我不是。 我将在我的代码中附上注释,解释它应该做什么。本质上它使用私有(private)构造
我正在编写一个 c# 程序,它将启动许多子进程。稍后,我需要通过 ID 检索这些进程,然后将这些进程与存储在字典中的一组进程进行匹配,这些进程在首次创建时添加到字典中。但是,我遇到了一个看起来很荒谬的
我仍在努力弄清楚,为什么我只看到典型的“黑屏”。我只渲染了一个矩形,但什么也没发生。 #include "expwidget.h" #include ExpWidget::ExpWidget(QOb
我有一个 I/O 密集型操作。 我只希望一次最多运行 5 个线程。 我有 8000 个任务要排队并完成。 执行每个任务大约需要 15-20 秒。 我查看了 ThreadPool,但是
我正在尝试学习在 JavaScript 中进行面向对象的编程并严格违反 JSLint。我知道我在非全局环境中使用它(或类似的东西......),但我不知道如何正确地做到这一点。这是我的代码: func
我正在开发一个包含 javascript 图像旋转器的网页,但它需要能够处理不同尺寸的图像。 我用作基础的代码在包含图像的 float LI 外部有一个 DIV,但无论我尝试什么,我似乎都无法让图像全
我是一名优秀的程序员,十分优秀!