Depuración de datos de la database: falso positivo

Como se mencionó en la session WWDC 2014 225 (Qué hay de nuevo en Core Data), Core Data en iOS 8 y OS X Yosemite ahora admite el argumento de command-line -com.apple.CoreData.ConcurrencyDebug 1 para habilitar aserciones que detectan violaciones del contrato de concurrency de Core Data .

En mis experimentos con esto, he descubierto que funciona con iOS 8 beta 1 (tanto en el dispositivo como en el simulador), pero parece que he encontrado un falso positivo, es decir, el marco está lanzando una exception de infracción multihilo donde debería no lo hagas Al less eso es lo que creo.

Pregunta: ¿el código a continuación es correcto o estoy haciendo algo que viole el model de subprocesamiento de Core Data?

Lo que hago es configurar una stack de datos básicos muy simple (con un almacén en memory, por motivos de simplicidad) con un context de object gestionado llamado backgroundContext con concurrency de queue privada. Luego invoco performBlockAndWait { } en ese context y en el bloque creo un nuevo object gestionado, lo inserto en el context y guardo.

La operación de save es donde obtengo la exception de infracción de subprocesss múltiples de Core Data.

 var backgroundContext: NSManagedObjectContext? func setupCoreDataStackAndViolateThreadingContract() { let objectModelURL = NSBundle.mainBundle().URLForResource("CoreDataDebugging", withExtension: "momd") let objectModel: NSManagedObjectModel? = NSManagedObjectModel(contentsOfURL: objectModelURL) assert(objectModel) // Set up a simple in-memory Store (without error handling) let storeCoordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: objectModel) assert(storeCoordinator) let store: NSPersistentStore? = storeCoordinator!.addPersistentStoreWithType(NSInMemoryStoreType, configuration: nil, URL: nil, options: nil, error: nil) assert(store) // Set up a managed object context with private queue concurrency backgroundContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType) assert(backgroundContext) backgroundContext!.persistentStoreCoordinator = storeCoordinator! // Work on the background context by using performBlock: // This should work but throws a multithreading violation exception on // self.backgroundContext!.save(&potentialSaveError) backgroundContext!.performBlockAndWait { NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: self.backgroundContext!) as NSManagedObject person.setValue("John Appleseed", forKey: "name") var potentialSaveError: NSError? // In the following line: EXC_BAD_INSTRUCTION in // `+[NSManagedObjectContext __Multithreading_Violation_AllThatIsLeftToUsIsHonor__]: let didSave = self.backgroundContext!.save(&potentialSaveError) if (didSave) { println("Saving successful") } else { let saveError = potentialSaveError! println("Saving failed with error: \(saveError)") } } } 

He probado básicamente el mismo código en Objective-C y obtuve el mismo resultado, así que dudo que sea un problema de Swift.

Editar: si desea ejecutar el código usted mismo, he puesto un proyecto en GitHub (requiere Xcode 6 / iOS 8 beta).

Apple confirmó esto como un error. Se ha solucionado con Xcode 6 beta 4.