2010-09-13 9 views
5

Tengo una relación 1-a-muchos en un gráfico de Core Data, y estoy tratando de entender la diferencia entre usar un método CoreDataGeneratedAccessors y una asignación simple para alterar una relación. Por ejemplo, el Core Data Programming Guide tiene un ejemplo de departamento y empleado. En ese ejemplo se utilizan los CoreDataGeneratedAccessors para contratar y despedir empleados:Core-Data CoreDataGeneratedAccessors versus asignación simple

[aDepartment addEmployeesObject:newEmployee]; 
[aDepartment removeEmployeesObject:firedEmployee]; 

No definen una relación inversa, pero dicen "departamento" es la relación inversa a los "empleados". ¿Debería entonces lo siguiente lograr lo mismo?

newEmployee.department = aDepartment 
firedEmployee.department = nil; 

De acuerdo con la sección Manipulating Relationships and Object Graph Integrity de la Guía de programación de datos básicos, los ejemplos posteriores deben corregir automáticamente todas las relaciones de mantener la coherencia gráfica. Si ese es el caso, ¿hay alguna razón para utilizar CoreDataGeneratedAccessors cuando existe una relación inversa? ¿El uso de CoreDataGeneratedAccessors mantiene la consistencia del gráfico en las relaciones inversas?

Respuesta

2

No definen un relación inversa, pero dicen "departamento" es la relación inversa a "empleados". ¿Debe lo siguiente, entonces lograr lo mismo?

Ambas operaciones tienen el mismo resultado, sin importar el final de la relación (con inversión) que modifique.

Si ese es el caso, ¿hay alguna razón para utilizar CoreDataGeneratedAccessors cuando existe una relación inversa? ¿El uso de CoreDataGeneratedAccessors mantiene la consistencia del gráfico en las relaciones inversas?

La consistencia no es un problema con ambos métodos. Por razones de rendimiento, es muy importante modificar las relaciones grandes con métodos apropiados.

Solución 1 (disparar a todos los empleados de un departamento)

for (Employee* employee in aDepartment.employees) 
{ 
    employee.department = nil 
} 

Solución 2

aDepartment.employees = nil; 

La primera solución sería desencadenar una actualización de un (mesa-) vista después de cada operación, mientras que el segundo daría como resultado exactamente una actualización de todas las vistas. Esto puede ser una gran diferencia si maneja una gran cantidad de objetos.

Si necesita más información en profundidad, creo que ya se han debatido temas similares en SO.

+0

Martin- gracias por la respuesta. Tengo una situación donde puedo usar [aDepartment addEmployeesObject: newEmployee] una vez, pero las llamadas posteriores dentro de la aplicación (independientemente de si está en otro newEmployee) no se actualiza. Sin embargo, reemplazar esto con newEmployee.department = aDepartment siempre funciona. Los comportamientos de las dos llamadas parecen inconsistentes, por lo que estoy desconcertado de que se supone que deben hacer lo mismo. Ideas? – chris

+0

@chris - parece que no tiene una relación inversa entre la entidad del Departamento y la entidad del Empleado. – TechZen

+0

Solo experimenté tal comportamiento en ciertas situaciones especiales cuando las observaciones se activan en ciertos procesos de cambio de datos centrales y en las relaciones de modificación del código de observador.(esto fue un error de mi código) –