Dov*_*Dov 4 multithreading core-data ios method-swizzling swizzle
我在单元测试期间在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
Run Code Online (Sandbox Code Playgroud)
我正在尝试确定导致它的原因,但由于它发生在NSManagedObjectContext队列中,因此该线程没有任何堆栈跟踪与我自己的代码.
我在设置断点的象征-[__NSCFSet addObject:]和-[NSManagedObjectContext processPendingChanges],但无法看到任何状态,而停在那里,帮助我确定哪些对象造成的问题.
我想到的下一步是尝试调配-[__NSCFSet addObject:]以添加我自己的实现,所以我只能在参数为零时停止.希望该集合不是空的,我可以通过在插入nil之前查看其内容来获取更多信息.然而,我遇到了困难,因为它是一个私人课程.
使用上面的方法,或者我没有考虑过的方法,如何获得有关导致异常的更多信息?
感谢@bteapot建议我将-com.apple.CoreData.ConcurrencyDebug 1参数添加到我的方案中.我从Ole Begemann出色的Core Data Concurrency Debugging文章中获得了有关其工作原理的更多信息.
添加此标志会导致在代码NSManagedObjectContext从错误的线程调用您的错误时抛出异常.这在Xcode中很有用,但是请注意,在Xcode Bot中,这会导致测试失败并显示以下无用的消息:
与测试管理器服务的连接丢失
| 归档时间: |
|
| 查看次数: |
3295 次 |
| 最近记录: |