¿Por qué obtengo una infracción de múltiples subprocesss CoreData cuando bash acceder a una propiedad de un object buscado?

El siguiente código funciona bien sin la última instrucción. Sin embargo, con la última línea, Xcode se detiene y muestra el siguiente post:

CoreData` + [NSManagedObjectContext Multithreading_Violation_AllThatIsLeftToUsIsHonor ]:

NSManagedObjectContext *context = GLOBAL_appDelegate.coreDataHelper.contextBackground; [context performBlock:^{ NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; [fetchRequest setEntity:[NSEntityDescription entityForName:@"CdTag" inManagedObjectContext:context]]; NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"title BEGINSWITH[cd] %@", @"webpages"]; [fetchRequest setPnetworkingicate:pnetworkingicate]; NSArray *cdTags = [context executeFetchRequest:fetchRequest error:nil]; NSLog(@"number of tags: %li", cdTags.count); CdTag *cdTag = [cdTags objectAtIndex:0]; // Accessing a property causes the assertion warning to be shown cdTag.title; }]; 

Estoy usando Xcode 7 beta 5 y tengo habilitadas las aserciones de varios subprocesss.

Los contexts se definen de la siguiente manera:

 _model = [NSManagedObjectModel mergedModelFromBundles:nil]; _coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model]; _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_context setPersistentStoreCoordinator:_coordinator]; _contextBackground = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [_contextBackground setParentContext:_context]; 

¿Esto es un error Xcode o hago algo mal?

¿Podría también agregar el código donde ocurre la initialization del context?

El error que obtienes está relacionado con el acceso a un context de object gestionado desde un subprocess / queue que no sea aquel en el que se inicializó.

Lo que generalmente sucede es que el context del object gestionado se inicializa utilizando el tipo de concurrency pnetworkingeterminado / henetworkingado tipo "confinamiento" para el que el

 performBlock: 

y

 performBlockAndWait: 

los methods en realidad no harán lo que anuncian que hacen, es decir, asegúrese de que se accede al context en la queue con la que se asoció al inicializarse.

Si lo que sugerí anteriormente es lo que realmente está sucediendo, podrías (asumiendo que todo lo demás está en su lugar) arregla esto al inicializar tu context así:

 _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 

o

 _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 

Aquí están los documentos sobre las estrategias de simultaneidad:

Cuando crea un context de object gestionado usando initWithConcurrencyType :, tiene tres opciones para su asociación de subprocesss (queue)

Confinamiento (NSConfinementConcurrencyType)

Para la compatibilidad con versiones anteriores, este es el valor pnetworkingeterminado. Prometes que ese context no será utilizado por ningún hilo que no sea aquel en el que lo creaste. En general, para hacer que el comportamiento sea explícito, se recomienda utilizar uno de los otros types.

Solo puede utilizar este tipo de concurrency si el almacén principal del context del object gestionado es un coordinador de tienda persistente.

Cola privada (NSPrivateQueueConcurrencyType)

El context crea y administra una queue privada.

Cola principal (NSMainQueueConcurrencyType)

El context está asociado con la queue principal y, como tal, está vinculado al ciclo de events de la aplicación, pero de otro modo es similar a un context basado en queues privadas. Utiliza este tipo de queue para contexts vinculados a controlleres y objects de interfaz de usuario que se requieren para usarse solo en el hilo principal.

Si utiliza contexts que utilizan el patrón de confinamiento, envía los posts de contexts directamente; Depende de usted para asegurarse de enviar los posts desde la queue derecha.

Utiliza contexts que utilizan los types de concurrency basados ​​en queues junto con performBlock: y performBlockAndWait :.

Apple Docs

Como nota al margen, el post de error que obtienes es uno de los últimos "huevos de Pascua" que todavía están dentro de Cocoa.

El problema ya no ocurre al crear iOS 9.0.