IOS crash 'NSInternalInconsistencyException', причина: оператор все еще активен. Кэш основных данных связан с кешем данных.
Очень редко они появляются в отчетах о сбоях на экранах с помощью 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)
Ответы
Ответ 1
Более чем вероятно, что это проблема с потоками в той или иной форме. Недостаточно информации в вопросе, чтобы убедиться наверняка, но стоит проверить журналы сбоев и посмотреть на трассировки стека для всех потоков во время исключения и посмотреть, не взаимодействуют ли какие-либо другие потоки, которые взаимодействуют с управляемым объектом. Возможно, у вас есть обработчик уведомлений, обработчик завершения URL-соединения или какой-либо другой бит кода, используя concurrency, который вы не заметили, используя основные объекты данных в фоновом режиме. Стоит отметить, что установка или доступ к любому свойству на любом управляемом объекте из контекста, который используется более чем в одном потоке, потенциально может вызвать такой вид исключения, что может затруднить диагностику.
Относительно простое решение для решения этих проблем в большинстве приложений заключается в том, чтобы запустить выполнение этого кода в основной поток (используя dispatch_async()
). В качестве альтернативы, если у вас много обработки, это может быть лучше создать дочерний контекст в фоновом потоке и повторно извлечь объект из дочернего контекста, а затем сохранить дочерний контекст. Конечно, для повторной выборки объекта вам нужно иметь свой objectID
, который является свойством, доступ к которому можно получить только в потоке, изначально изначально полученном объектом...
Ответ 2
Получил эту ошибку, одновременно запрашивая данные с помощью NSFetchedResultController (из контекста основного потока) и NSFetchRequest через мой фоновый контекст.
То, как я справлялся с этим, заключается в том, чтобы каждый из моих MOC имел свой собственный постоянный координатор хранилища. Оба постоянных координатора хранилища разговаривают с одним и тем же постоянным хранилищем на диске.