我在一个多线程的iOS应用程序中使用CoreData,一切似乎都很好——除非我在XCode中打开异常断点.每当我做一些CoreData工作时,断点都会在NSManagedObjectContext上的save:方法处停止,但之后NSError为nil.我的日志(log)中也没有任何内容(除了:Catchpoint 2 (exception thrown).),应用程序不会崩溃...所以很难判断到底出了什么问题.

我唯一的线索是,在我的NSManagedObjectContext中,updatedObjects:中只有一个物体,但它似乎没有什么问题.

我的问题与this question on stackoverflow 非常相似,但唯一的答案对我没有帮助;我很确定我已经把一切都准备好了.

这里怎么了?或者是否有其他可能获取错误信息?

非常感谢你!

EDIT:显示代码相当困难.我用objectID加载对象,编辑并将它们存储在分配给当前线程的上下文中.我已经判断过了——当前线程的上下文总是正确的;每个线程都有自己的上下文,这不应该是问题所在.如果有人能告诉我如何从错误/异常中获取更多信息,或者如果我必须关心它,那将是非常有帮助的.在我看来,异常似乎是在"save"方法中捕获的,所以它可能是一种"正常"行为吗?

推荐答案

这是normal种行为.CoreData使用异常抛出&;对于一些程序流的内部处理.我和CoreData的人谈过这件事.这可能看起来很奇怪,但这是他们很久以前做出的设计决定.

当遇到异常时,确保在调用-[NSManagedObjectContext save:]和抛出异常之间的回溯中没有代码.调用-save:很可能会回调到代码中,例如,如果你正在观察NSManagedObjectContextObjectsDidChangeNotification,如果你在处理这些通知时做了坏事,那么显然是你错了.

如果退出-save:方法,返回值为YES,则一切正常.

请注意,您应该判断返回值,使用error != nil判断错误.正确的判断是:

NSError *error = nil;
BOOL success = [moc save:&error];
if (!success) {
    // do error handling here.
}

Objective-c相关问答推荐

为什么 UITableViewCell Select 时所有背景都消失了?

让 iPhone sleeping

Objective-C 属性的默认属性是什么?

Objective-C:如何使用 BOOL 类型的参数调用 performSelector?

使用 UIViewControllerInteractiveTransitioning 委托协议实现自定义 UIViewController 交互式过渡的正确方法

try 标记应用程序图标但未获得用户标记应用程序的权限:iOS 8 Xcode 6

.delegate=self 是什么意思?

如何以编程方式退出 mac 应用程序?

我们可以在 UIPageViewController 中自定义页面指示器吗?

Grand Central Dispatch (GCD) 与 performSelector - 需要更好的解释

如何从 RGBA 创建 UIColor?

dispatch_async(dispatch_get_main_queue(), ^{...});等到完成?

为什么 NSOrderedSet 不继承自 NSSet?

当用户点击文本字段外的其他区域时如何关闭键盘?

如何在 iOS 7 启动期间更改状态栏样式

如何在 Cocoa 中获取 NSArray 的第一个 x 元素?

UITableViewCell 右侧有图像?

Select 具有受支持架构的目标以便在此设备上运行

如何在今天午夜获取 NSDate 对象?

使用正则表达式查找/替换 NSString 中的子字符串