核心数据崩溃NSInternalInconsistencyException'语句仍处于活动状态'

cfi*_*elp 22 core-data objective-c nsmanagedobjectcontext ios

我有两个托管对象上下文共享同一个持久性存储协调器:

  • 一个NSMainQueueConcurrencyType用于主线程和
  • 一个NSPrivateQueueConcurrencyType用于进行后台处理的.

所有数据解析工作都在针对私有队列的performBlock调用中进行,并通过NSManagedObjectContextDidSaveNotification主要线程上的UI更新进行合并.

我启用了Core Data多线程断言,并且在崩溃发生时它们永远不会触发.

我偶尔会遇到一个崩溃,statement is still active当我推送一个有一段NSFetchedResultsController时间背景上下文工作的新视图时.崩溃将触发对获取的结果控制器的获取或在存储数据的代码中.当它在数据解析部分崩溃时,它总是以多对多关系失败.

到目前为止,这些崩溃是100%的iOS 8,我从未在7上看过它们.

我的问题是这样的:假设我没有违反线程限制(断言应该大声喊叫,而且还没有...)是否有任何其他显而易见的事情我可能会这样做会导致主线程上下文爆炸后台线程正在处理持久存储的工作?

这就是Crashlytics所说的:

Thread : Fatal Exception: NSInternalInconsistencyException
0  CoreFoundation                 0x00000001871e659c __exceptionPreprocess + 132
1  libobjc.A.dylib                0x00000001978f00e4 objc_exception_throw + 60
2  CoreData                       0x0000000186e97c6c -[NSSQLiteStatement cachedSQLiteStatement]
3  CoreData                       0x0000000186e9739c -[NSSQLiteConnection prepareSQLStatement:] + 76
4  CoreData                       0x0000000186eb3810 -[NSSQLChannel selectRowsWithCachedStatement:] + 76
5  CoreData                       0x0000000186f9e7a4 newFetchedRowsForFetchPlan_MT + 1100
6  CoreData                       0x0000000186ecf948 -[NSSQLCore newFetchedPKsForSourceID:andRelationship:] + 2120
7  CoreData                       0x0000000186ecea24 -[NSSQLCore newValueForRelationship:forObjectWithID:withContext:error:] + 616
8  CoreData                       0x0000000186f67480 __110-[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:]_block_invoke + 80
9  CoreData                       0x0000000186f6d654 gutsOfBlockToNSPersistentStoreCoordinatorPerform + 180
10 CoreData                       0x0000000186f60ccc _perform + 204
11 CoreData                       0x0000000186ece730 -[NSPersistentStoreCoordinator(_NSInternalMethods) newValueForRelationship:forObjectWithID:withContext:error:] + 160
12 CoreData                       0x0000000186ece4d8 -[NSFaultHandler retainedFulfillAggregateFaultForObject:andRelationship:withContext:] + 716
13 CoreData                       0x0000000186ef15ec -[_NSFaultingMutableSet willReadWithContents:] + 444
14 CoreData                       0x0000000186ed146c -[_NSFaultingMutableSet count] + 32
15 CoreData                       0x0000000186ecd234 -[NSManagedObject(_NSInternalMethods) _didChangeValue:forRelationship:named:withInverse:] + 440
16 Foundation                     0x0000000187fe1a14 NSKeyValueNotifyObserver + 340
17 Foundation                     0x0000000187fe1534 NSKeyValueDidChange + 460
18 Foundation                     0x0000000187fcaac4 -[NSObject(NSKeyValueObserverNotification) didChangeValueForKey:] + 116
19 CoreData                       0x0000000186ec4e90 _PF_ManagedObject_DidChangeValueForKeyIndex + 140
20 CoreData                       0x0000000186ec3248 _sharedIMPL_setvfk_core + 284
21 My App                     0x00000001000f0b00 -[LocationAdapter processBuildingList:context:completion:] (LocationAdapter.m:134)
Run Code Online (Sandbox Code Playgroud)

cfi*_*elp 1

我最终改变了创建核心数据堆栈的方式,这个问题就消失了。转移到持久存储上下文、子 UI 上下文和孙子背景上下文并适当地沿链向上持久化可以使这一切变得更好。我仍然不能 100% 确定为什么原始设置不适用于 8。