我在单元测试期间在Core Data线程上抛出异常,并显示以下消息:
CoreData:错误:严重的应用程序错误.在Core Data更改处理期间捕获到异常.这通常是NSManagedObjectContextObjectsDidChangeNotification的观察者中的错误. - [__ NSCFSet addObject:]:尝试使用userInfo插入nil(null)
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFSet addObject:]: attempt to insert nil' *** First throw call stack: ( 0 CoreFoundation 0x00683a14 __exceptionPreprocess + 180 1 libobjc.A.dylib 0x02334e02 objc_exception_throw + 50 2 CoreFoundation 0x0068393d +[NSException raise:format:] + 141 3 CoreFoundation 0x005595b9 -[__NSCFSet addObject:] + 185 4 CoreData 0x001d47c0 -[NSManagedObjectContext(_NSInternalChangeProcessing) _processPendingInsertions:withDeletions:withUpdates:] + 560 5 CoreData 0x001cee8a -[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2410 6 CoreData 0x001ce506 -[NSManagedObjectContext processPendingChanges] + 54 7 CoreData 0x001f359b developerSubmittedBlockToNSManagedObjectContextPerform + 443
我正在尝试确定导致它的原因,但由于它发生在NSManagedObjectContext
队列中,因此该线程没有任何堆栈跟踪与我自己的代码.
我在设置断点的象征-[__NSCFSet addObject:]
和-[NSManagedObjectContext processPendingChanges]
,但无法看到任何状态,而停在那里,帮助我确定哪些对象造成的问题.
我想到的下一步是尝试调配-[__NSCFSet addObject:]
以添加我自己的实现,所以我只能在参数为零时停止.希望该集合不是空的,我可以通过在插入nil之前查看其内容来获取更多信息.然而,我遇到了困难,因为它是一个私人课程.
使用上面的方法,或者我没有考虑过的方法,如何获得有关导致异常的更多信息?
感谢@bteapot建议我将-com.apple.CoreData.ConcurrencyDebug 1
参数添加到我的方案中.我从Ole Begemann出色的Core Data Concurrency Debugging文章中获得了有关其工作原理的更多信息.
添加此标志会导致在代码NSManagedObjectContext
从错误的线程调用您的错误时抛出异常.这在Xcode中很有用,但是请注意,在Xcode Bot中,这会导致测试失败并显示以下无用的消息:
与测试管理器服务的连接丢失