Cómo implementar la nueva propiedad 'única' del generador de models de Core Data en iOS 9.0 Beta

En la session de video WWDC15, "Novedades de los datos básicos" a las 10:45 minutos (en la presentación), el ingeniero de Apple describe una nueva característica del generador de models que le permite especificar properties únicas. Una vez que configure esas properties únicas, Core Data no creará un object duplicado con esa propiedad. Esto se supone que elimina la necesidad de comprobar si un object idéntico antes de crear un nuevo object.

He estado experimentando con esto pero no tengo suerte previniendo la creación de nuevos objects con idénticas properties 'únicas' (objects duplicates). Aparte de la explicación del video de 5 minutos, no he encontrado ninguna otra información que describa cómo usar esta function.

introduzca la descripción de la imagen aquí

¿Alguien tiene alguna experiencia implementando el atributo de propiedad 'único' en el Modelo de Datos del Núcleo?

Respuesta corta: necesitará agregar esta línea al código de configuration de su stack de datos principales:

managedObjectContext.mergePolicy = NSMergeByPropertyObjectTrumpMergePolicy 

Larga respuesta: luché con esto por un time, pero creo que lo he descubierto ahora:

Restricciones únicas (CU) no impiden crear duplicates en un context. Solo cuando intenta save ese context, Core Data comtesting la exclusividad de las UC.

Si encuentra más de un object con el mismo valor para una CU, el comportamiento pnetworkingeterminado es arrojar un error porque la política de combinación pnetworkingeterminada para los conflictos es NSErrorMergePolicyType . El error contiene los objects en conflicto en su userInfo.conflictList , por lo que puede resolver manualmente el conflicto.

Pero la mayoría de las veces es probable que desee usar una de las otras políticas de combinación y dejar que Core Data fusione automáticamente los conflictos. Estas políticas de fusión ya existían antes, se utilizan para conflictos entre objects en diferentes contexts. Tal vez por eso no se mencionaron en el context de la característica UC en la Sesión 220 de WWDC. Por lo general, la elección correcta es NSMergeByPropertyObjectTrumpMergePolicy . Básicamente dice que "los datos nuevos superan los datos antiguos", que es lo que quiere en el escenario común cuando importa nuevos datos de fonts externas.

(Sugerencia: Primero tuve problemas para verificar este comportamiento, porque los objects duplicates parecen permanecer en el context hasta que la operación de salvar esté terminada, lo que sucedió en mi caso de forma asíncrona en una queue de background. Entonces, si busca / count sus objects inmediatamente después de presionar el button save, aún podría ver los duplicates).

No sé la respuesta correcta, ya que es una versión beta, pero después de jugarlo por un minuto, encontré una forma de hacer que funcione:

  1. Indique al model qué attributes forman la restricción única, exactamente como se muestra en la image que tiene en su pregunta.

  2. Agregar un nuevo logging:

 let newTag = NSEntityDescription.insertNewObjectForEntityForName("Tag", inManagedObjectContext: context) as! Tag 
  1. Asigne los valores a las attribues.

  2. Guarde sus cambios:

 do { try context.save() } catch let error as NSError { print("Error: \(error.localizedDescription)") context.reset() } 

La key está en el bloque de catch . Si ocurre un error, restablezca el context al estado anterior. Cuando falla la operación de save, los loggings duplicates no estarán allí.

Tenga en count que debe verificar el error para ver si fue causado por un logging duplicado.

Espero que esto ayude.