NSManagedObjectContext bloqueado

Tengo dos subprocesss que funcionan en mi aplicación.

  • En el subprocess principal, actualizo los valores de las keys en entidades o obtengo algunas filas de Core Data.
  • En el hilo de background descargo datos de un server.

Pero algunas veces durante la actualización / procesamiento de los datos centrales en [managedObjectContext executeFetchRequest:request error:&error]

… Yo obtengo:

#0 0x34507c5c in semaphore_wait_signal_trap ()
#1 0x34507f58 in semaphore_wait_signal ()

 #2 0x364d573a in pthread_mutex_lock () #3 0x35c91a2e in -[_PFLock lock] () #4 0x35c91a12 in -[NSPersistentStoreCoordinator lock] () #5 0x35c919e8 in -[NSManagedObjectContext(_NSInternalAdditions) lockObjectStore] () #6 0x35c90676 in -[NSManagedObjectContext executeFetchRequest:error:] () 

¿Cómo se bloquea el NSManagedObjectContext? ¿Qué puedo hacer por esto?

La cerradura es parte de la operación normal y no es la fuente de su problema.

Lo más probable es que tenga un problema al administrar el context en los hilos separados. Asegúrese de usar un context diferente para cada subprocess y asegúrese de no pasar los objects administrados entre los subprocesss. Asegúrese de fusionar los contexts antes de intentar acceder a los cambios realizados en un hilo de otro.

Dominar CoreData en aplicaciones multiprocess puede ser difícil. Asegúrese de crear un nuevo NSManagedObjectContext para cada subprocess que utiliza CoreData. El MOC debe crearse en el hilo donde se usa. El propio MOC no es seguro para subprocesss. CoreData no lo bloquea para usted. Si usa un nuevo MOC para cada hilo, no tiene que hacer el locking. En su stacktrace puede ver que NSPersistentStoreCoordinator está bloqueado (no el MOC). CoreData hace esto para que solo un MOC pueda acceder al NSPersistentStoreCoordinator al mismo time.