2012-03-01 15 views
16

Niekiedy bardzo często pojawiają się one w raportach o awariach na ekranach przy użyciu NSFetchedResultsController i nie wiesz, jak je rozwiązać. Nie wierzę, że używam wątków w dowolnym miejscu, chyba że NSFetchedResults używa ich wewnętrznie.Zdarzenie "NSInternalInconsistencyException" w systemie iOS, powód: "instrukcja jest nadal aktywna" Powiązana pamięć podręczna danych podstawowych?

"NSInternalInconsistencyException", powód: "instrukcja jest nadal aktywna" to pełne wyjaśnienie, które otrzymuję.

Dwa ostatnie ślady stosu:

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

Może spróbuj zweryfikować, że uzyskujesz dostęp tylko do Core Data z głównego wątku, dodając 'assert ([NSThread currentThread] == [NSThread mainThread])' w którym wykonujesz wywołania CoreData. – nielsbot

+0

cf. http://stackoverflow.com/questions/3078177/core-data-fetch-request-fails- with-nsinternalinconsistencyexception-reason – nielsbot

+0

Tak, widziałem to pytanie. Wydaje się nie odpowiadać na moje pytanie, ponieważ korzystali z dwóch MOC-ów, w które nie wierzę, że robię. –

Odpowiedz

15

Jest więcej niż prawdopodobne, że jest to problem gwintowania w ten czy inny sposób. W pytaniu nie ma wystarczającej ilości informacji, ale warto sprawdzić logi awarii i sprawdzić ślady stosów dla wszystkich wątków w czasie wyjątku i sprawdzić, czy inne wątki robią cokolwiek, co wchodzi w interakcje z zarządzanym obiektem. Możliwe, że masz program obsługi powiadomień, program obsługi zakończeń połączenia URL lub jakiś inny kod przy użyciu współbieżności, którego nie zauważyłeś, używając podstawowych obiektów danych w tle. Warto zauważyć, że ustawienie lub uzyskanie dostępu do dowolnej właściwości dowolnego zarządzanego obiektu z kontekstu używanego w więcej niż jednym wątku może potencjalnie spowodować ten wyjątek, który może być trudny do zdiagnozowania.

Stosunkowo prostym rozwiązaniem rozwiązywania tych problemów w większości aplikacji jest popchnięcie wykonania tego kodu do głównego wątku (przy użyciu dispatch_async()). Alternatywnie, jeśli masz dużo przetwarzania, lepiej utworzyć kontekst podrzędny w wątku w tle i ponownie pobrać obiekt z kontekstu podrzędnego, a następnie zapisać kontekst podrzędny. Oczywiście, aby ponownie pobrać obiekt trzeba mieć swój objectID, która jest właściwością, która może być dostępna tylko na gwincie obiekt został pierwotnie pobrane na ...

+0

Zazwyczaj ma to miejsce, gdy próbowałem zapisać główny kontekst ui w performBlocku, wykonując w prywatnej kolejce jednego z jego dzieci ... – MiKL

+1

+1 dla "i zobacz, czy inne wątki robią cokolwiek, co współdziała z zarządzanym obiekt " –

+0

Czy to prawda? "Oczywiście, aby ponownie pobrać obiekt, musisz mieć jego objectID, który jest właściwością, do której można uzyskać dostęp tylko w wątku, w którym obiekt był pierwotnie pobrany ..." –

6

Got to błąd podczas jednoczesne żądanie danych z NSFetchedResultController (od kontekst wątku głównego) i NSFetchRequest poprzez kontekst kontekstowy.

Sposób, w jaki to zrobiłem, polega na tym, że każdy z moich MOC-ów ma swojego stałego koordynatora sklepu. Obaj z stałych koordynatorów sklepu rozmawiają z tym samym stałym magazynem na dysku.

Powiązane problemy