Сбой iOS «NSInternalInconsistencyException», причина: «оператор все еще активен» Связанный с кэшем данных ядра? - PullRequest
16 голосов
/ 02 марта 2012

Очень редко они появляются в отчетах о сбоях на экранах с использованием NSFetchedResultsController и не знают, как их решить.Я не верю, что где-либо использую многопоточность, если только NSFetchedResults не использует их внутренне.

«NSInternalInconsistencyException», причина: «оператор все еще активен»get.

Две последние трассировки стека:

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)

Ответы [ 2 ]

15 голосов
/ 20 мая 2013

Более чем вероятно, что это проблема потоков, так или иначе. В этом вопросе недостаточно информации, чтобы убедиться в этом, но стоит проверить журналы сбоев и посмотреть трассировку стека для всех потоков во время исключения, а также посмотреть, делают ли другие потоки что-нибудь, что взаимодействует. с управляемым объектом. Возможно, у вас есть обработчик уведомлений, обработчик завершения соединения URL или какой-то другой фрагмент кода с использованием параллелизма, который вы не заметили, с использованием основных объектов данных в фоновом режиме. Стоит отметить, что установка или доступ к любому свойству любого управляемого объекта из контекста, который используется более чем в одном потоке, потенциально может вызвать такого рода исключения, что может затруднить диагностику.

Относительно простое решение этих проблем в большинстве приложений состоит в том, чтобы передать выполнение этого кода в основной поток (используя dispatch_async()). В качестве альтернативы, если у вас есть много обработки, может быть лучше создать дочерний контекст в фоновом потоке и повторно извлечь объект из дочернего контекста, а затем сохранить дочерний контекст. Конечно, для повторного извлечения объекта вам нужно иметь его objectID, которое является свойством, доступ к которому можно получить только в потоке, в который объект был первоначально извлечен…

6 голосов
/ 20 февраля 2015

Получил эту ошибку при одновременном запросе данных с NSFetchedResultController (из контекста основного потока) и NSFetchRequest через мой фоновый контекст.

Способ, которым я справился, заключается в том, чтобы у каждого из моих MOC был свой постоянный координатор хранилища. Оба координатора постоянного хранилища взаимодействуют с одним и тем же постоянным хранилищем на диске.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...