EXC _ ???执行executeFetchRequest时

时间:2013-02-11 13:07:22

标签: ios core-data

我正在尝试使用Core Data将外部数据添加到SQLite /更新现有数据。

基本上,我从外部Web服务获得一个JSON,我使用以下代码来确定是否应该在DB中添加新的或更新现有对象。

NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
[fetch setEntity:[NSEntityDescription entityForName:@"name" inManagedObjectContext:context]];
[fetch setPredicate:[NSPredicate predicateWithFormat:@"id = %@", [data valueForKey:@"key"]]];
NSArray *results = [context executeFetchRequest:fetch error:nil];

if (results.count == 1)
{
    // update existing
}
else
{
    // add new
}

问题是:有时这段代码会导致异常:

Thread 1: EXC_??? (11) (code=0, subcode=0x0)

NSManagedObjectContext executeFetchRequest:error:

中引发了异常

如果我继续执行我的应用程序,一切似乎都可以。

我应该担心这个例外吗?

我的意思是说它有点烦人但更重要的是要知道这个例外的原因和后果是什么?

一些额外的细节(以防它是相关的):

  • 上面的代码在一个循环中被执行多次(大约25万次)。
  • 代码在主线程上运行(是的,我知道,但它是原型)。
  • 在主线程上创建了Context。
  • 外部数据在后台线程中创建

[编辑] 更多细节:

  • executeFetchRequest:error即使在引发异常时也会返回初始化数组。
  • 当我向error
  • 提供executeFetchRequest:error参数时,没有设置错误

1 个答案:

答案 0 :(得分:1)

这不安全。

您应该检查方法的返回以确保您已经将数组交回

NSArray *results = [context executeFetchRequest:fetch error:nil];
if (!results) {
    // An error occurred you should probably use the out error
}

同样,CoreData似乎在内部抛出异常但处理它们,所以如果你有一个异常断点集,它很可能会被从CoreData堆栈的随机点捕获 - 我从过去的经验中说这是不确定它是否记录在任何地方但是在这段视频中提到了Debugging Tips - Mike Hay