2012-03-01 12 views
16

Di tanto in tanto si vedono questi pop-up nei rapporti sugli arresti anomali sugli schermi utilizzando NSFetchedResultsController e non si sa come affrontarli. Non credo di utilizzare il threading da nessuna parte, a meno che lo NSFetchedResults le stia utilizzando internamente.Arresto iOS 'NSInternalInconsistencyException', motivo: 'l'istruzione è ancora attiva' La cache dei dati di base è correlata?

'NSInternalInconsistencyException', motivo: 'istruzione è ancora attiva' è la spiegazione completa che ottengo.

Due recenti tracce di stack:

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

Forse prova a verificare che stai solo accedendo ai dati principali dal tuo thread principale aggiungendo 'assert ([NSThread currentThread] == [NSThread mainThread])' dove effettui chiamate CoreData. – nielsbot

+0

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

+0

Sì, ho visto quella domanda. Non sembra rispondere alla mia domanda dato che stavano usando due MOC, cosa che non credo di fare. –

risposta

15

E 'più che probabile che questo è un problema di threading in un modo o nell'altro. Non ci sono abbastanza informazioni nella domanda da vedere con certezza, ma vale la pena controllare i registri degli arresti anomali e osservare le tracce dello stack per tutti i thread al momento dell'eccezione, e vedere se altri thread stanno facendo qualcosa che interagisce con un oggetto gestito. Potrebbe essere che tu abbia un gestore di notifica, un gestore di completamento della connessione URL o un altro bit di codice che utilizza la concorrenza che non avevi notato, utilizzando oggetti di dati di base in background. Vale la pena notare che l'impostazione o l'accesso a qualsiasi proprietà su qualsiasi oggetto gestito da un contesto che viene utilizzato su più thread potrebbe potenzialmente attivare questo tipo di eccezione, che può rendere piuttosto difficile la diagnosi.

La soluzione relativamente semplice per risolvere questi problemi nella maggior parte delle app è quella di spingere l'esecuzione di quel codice al thread principale (utilizzando dispatch_async()). In alternativa, se hai un sacco di elaborazione da fare potrebbe essere meglio creare un contesto figlio sul thread in background e recuperare l'oggetto dal contesto figlio, quindi salvare il contesto figlio. Naturalmente, per ri-prendere l'oggetto è necessario avere la sua objectID, che è una proprietà cui si può accedere solo sul filo l'oggetto è stato originariamente prelevato sul ...

+0

In genere ciò si verifica quando ho provato a salvare un contesto ui principale all'interno di un eseguBlock in esecuzione sulla coda privata di uno dei suoi figli ... – MiKL

+1

+1 per "e vedere se qualsiasi altro thread sta facendo qualcosa che interagisce con un gestito oggetto " –

+0

È vero? "Ovviamente, per recuperare nuovamente l'oggetto è necessario avere il suo objectID, che è una proprietà a cui è possibile accedere solo sul thread su cui l'oggetto è stato originariamente scaricato ..." –

6

ottenuto questo errore e contemporaneamente la richiesta di dati con NSFetchedResultController (da main thread context) e NSFetchRequest attraverso il mio contesto di background.

Il modo in cui l'ho gestito è che ognuno dei miei MOC ha il proprio coordinatore di negozio permanente. Entrambi i coordinatori di negozi persistenti parlano dello stesso archivio persistente sul disco.

Problemi correlati