objective-c - NSManagedObjectContext : exception breakpoint stops at save: method, 但没有日志/崩溃/错误

标签 objective-c core-data

我在多线程 iOS 应用程序中使用 CoreData,一切似乎都运行良好 - 除非我在 XCode 中打开异常断点。每当我做一些 CoreData 工作时,断点会在 NSManagedObjectContext 上的 save:-method 处停止 - 但之后 NSError 为零。我的日志中也没有任何内容(除了:Catchpoint 2(抛出异常)。),应用程序没有崩溃……所以很难判断出了什么问题。

我唯一的线索是我的 NSManagedObjectContext 中的 updatedObjects: 中有一个对象 - 但它似乎没有任何问题。

我的问题与 this question on stackoverflow 非常相似,但那里唯一的答案对我没有帮助;我很确定我已经涵盖了所有内容。

这里可能有什么问题?或者是否有其他可能获取一些错误信息?

非常感谢!

编辑:显示代码非常困难。我正在使用 objectID 加载对象,编辑它们并将它们存储在分配给当前线程的上下文中。我已经检查过了——当前线程的上下文总是正确的;每个线程都有自己的上下文,这不应该是问题。如果只有有人可以告诉我如何从该错误/异常中获取更多信息,或者我毕竟必须关心它,那将会很有帮助。在我看来,好像异常是在“保存”方法中捕获的,所以它可能是“正常”行为?

最佳答案

这是正常行为。 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 - NSManagedObjectContext : exception breakpoint stops at save: method, 但没有日志/崩溃/错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8337635/

相关文章:

ios - 如何使用 nib 文件为 TableView 创建动态单元格

class - Core Data NSPredicate 按实体类过滤?

objective-c - xmppstream 委托(delegate)方法未在我的自定义类上调用

iOS - 错过了导航流程

ios - GCD 与自定义队列

iphone - 如何从 UI 深处的 Controller 访问 ManagedObjectContext?

ios - 在用户注销时保留 CoreData 对象的最佳方法(NSUserDefaults?)

objective-c - 从后台线程访问 NSManagedObject 上的属性是否会使上下文跨该线程?

ios - iPad 1 "400 BadRequest"与 sendAsynchronousRequest,所有工作在 iPad 3

ios - 仅在凭据正确时才切换屏幕