Múltiples NSManagedObjectContexts en una exception NSPersistentStoreCoordinator throws 'statement is still active' exception

Estoy cambiando mi configuration CoreData para tener 2 NSManagedObjectContext s bajo 1 NSPersistentStoreCoordinator .

  1. El context raíz es NSManagedObjectContext instanciado con NSPrivateQueueConcurrencyType y se establece en NSMergeByPropertyStoreTrumpMergePolicy
  2. El context principal es NSManagedObjectContext instanciado con NSMainQueueConcurrencyType también configurado en un NSMergeByPropertyStoreTrumpMergePolicy

Ambos no están conectados por la relación "padre-hijo", sin embargo, se les asigna el mismo object NSPersistentStoreCoordinator . El context principal está escuchando la notificación NSManagedObjectContextDidSaveNotification context raíz y realiza la combinación necesaria dentro de performBlock:

Ocasionalmente, cuando una instancia de NSFetchedResultsController se engancha con el context principal hace un performFetch que obtuve

Finalización de la aplicación debido a la exception no detectada 'NSInternalInconsistencyException', motivo: 'la statement sigue activa'

Me pregunto si lo que voy a hacer aquí no debería hacerse ni una limitación de los Datos básicos.

Gracias

Florian Kugler escribió un buen artículo sobre esto: The Concurrent Core Core Stack

La idea es importar sus datos en un context de queue privada (context de import ) que es secundario del context principal .

Este context principal está en la queue principal (me gusta llamarlo queue de interfaz de usuario), por lo que puedes usar los objects fuera de él en el hilo principal (subprocess de interfaz de usuario) sin tener que convertirlos de un hilo privado al hilo principal.

Finalmente, el context principal es hijo de su context raíz que se ejecuta en su propia queue privada. De esa forma, las guardadas se realizarán en un hilo de background y no bloquearán su interfaz de usuario.

Dado que en esta configuration nunca se toca el [Context raíz], es decir, nunca se realizan cambios directamente en él, todos los cambios fluyen a través del context principal. Por lo tanto, siempre tendrá los últimos datos disponibles en el hilo principal. No hay necesidad de escuchar cambios en las notifications y combinar manualmente los cambios.

No me preocuparía por el performance en primer lugar. Core Data está muy optimizado y si surgen problemas de performance, puede disminuir la cantidad de datos que ahorra un único trabajador de import.