ios objective-c core-data nsmanagedobjectcontext

ios - Accidente de Core Data NSInternalInconsistencyException ''declaración todavía está activo''



objective-c core-data (2)

Tengo dos contextos de objetos gestionados que comparten el mismo coordinador de tienda persistente:

  • Uno con NSMainQueueConcurrencyType para el hilo principal y
  • Uno que es NSPrivateQueueConcurrencyType para hacer un procesamiento en segundo plano.

Todo el trabajo de análisis de datos ocurre en llamadas a performBlock contra la cola privada y se fusionan a través de NSManagedObjectContextDidSaveNotification para actualizaciones de UI en el hilo principal.

Tengo habilitadas las aserciones de Multithreading de datos principales y nunca se disparan cuando ocurre el bloqueo.

De vez en cuando recibo un bloqueo que dice que la statement is still active cuando NSFetchedResultsController en una nueva vista que tiene un NSFetchedResultsController mientras el contexto de fondo está funcionando. El bloqueo se activará en la búsqueda para el controlador de resultados obtenidos o dentro del código que está almacenando datos. Cuando se bloquea en la sección de análisis de datos, siempre falla en una relación de muchos.

Estos bloqueos son 100% iOS 8 hasta el momento y nunca los he visto en 7.

Mi pregunta es la siguiente: suponiendo que no estoy violando el confinamiento del hilo (que la afirmación debería gritar en voz alta, y no lo ha hecho ...) ¿hay algo más obvio que podría estar haciendo que el contexto del hilo principal salga volando? mientras que el hilo de fondo está en el proceso de hacer el trabajo en la tienda persistente?

Esto es lo que dice 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)


Puede utilizar la copia del contexto del objeto nsmanaged como una nueva instancia de nsmanagedobject context. Para cada contexto de objeto gestionado, debe usar de esta manera, donde quiera guardar la inconsistencia en multihilo

[backgroundMOC performBlockAndWait:^{ // read/write operation [backgroundMOC saveContextWithMOC:backgroundMOC]; }];

// Tema principal MOC

[mainMOC performBlockAndWait:^{ // read/write operation [backgroundMOC saveContextWithMOC:backgroundMOC]; }];


Terminé cambiando la forma en que creé la pila de datos básicos y esto desapareció. Pasar a un contexto de tienda persistente, un contexto de interfaz de usuario infantil y un contexto de fondo de nieto, y la persistencia de la cadena de manera apropiada lo hicieron todo mejor. Todavía no estoy 100% seguro de por qué la configuración original no funcionó con 8.