iOS的崩溃'NSInternalInconsistencyException',原因:'语句仍然是'核心数据caching相关?

偶尔会在使用NSFetchedResultsController屏幕上看到这些崩溃报告,而不知道如何解决这些问题。 我不相信我在任何地方使用线程,除非NSFetchedResults在内部使用它们。

'NSInternalInconsistencyException',原因:'语句仍然活跃'是我得到的完整解释。

最近的两个堆栈跟踪:

 0 CoreFoundation 0x37a368bf __exceptionPreprocess + 163 1 libobjc.A.dylib 0x3151c1e5 objc_exception_throw + 33 2 CoreData 0x340b2ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1 3 CoreData 0x340b274f -[NSSQLiteConnection prepareSQLStatement:] + 55 4 CoreData 0x34156049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61 5 CoreData 0x34181d63 newFetchedRowsForFetchPlan_MT + 783 6 CoreData 0x340bab07 -[NSSQLCore newRowsForFetchPlan:] + 351 7 CoreData 0x34160011 -[NSSQLCore fetchRowForObjectID:] + 1005 8 CoreData 0x340cca57 -[NSSQLCore newValuesForObjectWithID:withContext:error:] + 195 9 CoreData 0x340cbf83 _PFFaultHandlerLookupRow + 423 10 CoreData 0x340cba97 _PF_FulfillDeferredFault + 187 11 CoreData 0x340cb94f _sharedIMPL_pvfk_core + 39 12 PowerPro 0x0006a779 -[GuestCard getPrimaryProspectiveTenant] (GuestCard.m:77) 13 PowerPro 0x00017bf9 -[OutstandingFollowupsViewController configureCell:atIndexPath:] (OutstandingFollowupsViewController.m:208) 14 PowerPro 0x00017b9b -[OutstandingFollowupsViewController tableView:cellForRowAtIndexPath:] (OutstandingFollowupsViewController.m:203) Last Exception Backtrace: 0 CoreFoundation 0x37a368bf __exceptionPreprocess + 163 1 libobjc.A.dylib 0x3151c1e5 objc_exception_throw + 33 2 CoreData 0x340b2ea5 -[NSSQLiteStatement cachedSQLiteStatement] + 1 3 CoreData 0x340b274f -[NSSQLiteConnection prepareSQLStatement:] + 55 4 CoreData 0x34156049 -[NSSQLChannel selectRowsWithCachedStatement:] + 61 5 CoreData 0x340c26eb -[NSSQLCore _newRowsForFetchPlan:selectedBy:withArgument:] + 515 6 CoreData 0x340bab3f -[NSSQLCore newRowsForFetchPlan:] + 407 7 CoreData 0x3415ea55 -[NSSQLCore newFetchedPKsForSourceID:andRelationship:] + 2217 8 CoreData 0x3416a935 -[NSSQLCore newValueForRelationship:forObjectWithID:withContext:error:] + 689 9 CoreData 0x34108f8b -[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:] + 479 10 CoreData 0x340dcb23 -[_NSFaultingMutableSet willRead] + 219 11 CoreData 0x340dc70b -[_NSFaultingMutableSet count] + 23 12 PowerPro 0x00016eb1 -[BrowseGuestCardsViewController configureCell:atIndexPath:] (BrowseGuestCardsViewController.m:246) 13 PowerPro 0x00017173 -[BrowseGuestCardsViewController tableView:cellForRowAtIndexPath:] (BrowseGuestCardsViewController.m:222) 14 UIKit 0x34e4e9cb -[UITableView(UITableViewInternal) _createPreparedCellForGlobalRow:withIndexPath:] + 547 15 UIKit 0x34e4daa9 -[UITableView(_UITableViewPrivate) _updateVisibleCellsNow:] + 1077 16 UIKit 0x34e4d233 -[UITableView layoutSubviews] + 207 17 UIKit 0x34df1d4b -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 183 18 CoreFoundation 0x3799522b -[NSObject performSelector:withObject:] + 43 19 QuartzCore 0x3318c381 -[CALayer layoutSublayers] + 217 20 QuartzCore 0x3318bf99 CA::Layer::layout_if_needed(CA::Transaction*) + 217 21 QuartzCore 0x3318bea5 -[CALayer layoutIfNeeded] + 153 22 UIKit 0x34eb6fe1 -[UIButton titleLabel] + 73 23 PowerPro 0x00017983 -[BrowseGuestCardsViewController viewDidLoad] (BrowseGuestCardsViewController.m:75) 

这很可能是这个或那个方面的线程问题。 在问题中没有足够的信息来确定,但值得检查崩溃日志,并查看exception时所有线程的堆栈跟踪,并查看是否有其他线程正在进行任何交互与一个被pipe理的对象。 这可能是因为你有一个通知处理程序,一个URL连接完成处理程序,或者其他一些使用并发性的代码,这些代码在后台使用核心数据对象,这些并没有被注意到。 值得注意的是,在多个线程上使用的上下文中设置或访问任何托pipe对象上的任何属性都可能触发这种exception,这可能会使诊断变得非常困难。

在大多数应用程序中解决这些问题的相对简单的解决scheme是将该代码的执行推送到主线程(使用dispatch_async() )。 另外,如果你有很多处理要做,最好在后台线程上创build一个子上下文,并从子上下文中重新获取对象,然后保存子上下文。 当然,要重新获取对象,你需要有它的objectID ,这是一个属性,只能访问线程上的对象最初被提取…

得到这个错误,同时请求数据NSFetchedResultController(从主线程上下文)和NSFetchRequest通过我的背景上下文。

我处理这个问题的方法是让每个MOC都有自己的持久性商店协调员。 两个持久性存储协调器都与磁盘上的相同持久性存储进行通信。