2011-09-23 10 views
16

Digamos que tengo dos entidades, empleado y departamento. Un departamento tiene una relación de muchos con el empleado, muchos empleados pueden estar en cada departamento, pero cada empleado solo pertenece a un departamento. Quiero mostrar todos los empleados en una vista de tabla ordenada por datos que son propiedad del departamento al que pertenecen utilizando un NSFetchedResultsController. El problema es que quiero que mi tabla se actualice cuando un objeto del departamento recibe cambios como lo hace si las propiedades regulares del empleado cambian, pero el FetchedResultsController no parece rastrear objetos relacionados. He llegado pasado este tema parcialmente de la siguiente manera:NSFetchedResultsController with relationship not updating

for (Employee* employee in department.employees) { 
    [employee willChangeValueForKey:@"dept"]; 
} 

/* Make Changes to department object */ 

for (Employee* employee in department.employees) { 
    [employee didChangeValueForKey:@"dept"]; 
} 

Esto obviamente no es ideal, pero sí causa el empleado método basado FRC delegado didChangeObject a ser llamado. El problema real que me queda ahora es en la clasificación de un FRC que es el seguimiento de objetos a los empleados:

NSEntityDescription *employee = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"department.someProperty" ascending:NO]; 

Esto funciona muy bien y ordena los empleados correctamente la primera vez que se llama, el problema es que cuando realiza cambios en una Algunos departamentos no pueden cambiar la clasificación de mi tabla de empleados. ¿Hay alguna buena manera de que mi empleado FRC siga los cambios en una relación? En particular, solo necesito una forma de que actualice la clasificación cuando la clasificación se basa en una propiedad relacionada. Revisé una pregunta similar pero no pude encontrar una solución satisfactoria.

Respuesta

16

El NSFetchedResultsController está diseñado solo para ver una entidad a la vez. Su configuración, si bien tiene sentido, es un poco más allá de lo que el NSFetchedResultsController actualmente es capaz de ver por sí mismo.

Mi recomendación sería configurar tu propio observador. Puede basarlo en ZSContextWatcher que configuré en GitHub o puede hacerlo aún más simple.

Básicamente, desea ver las publicaciones de NSManagedObjectContextDidSaveNotification y luego volver a cargar su tabla cuando se active uno que contenga la entidad de su departamento.

También recomendaría presentar un rdar con Apple y pedir que se mejore el NSFetchedResultsController.

+0

No estoy seguro de que desee configurar un FRC para ver más de una entidad a la vez. Las permutaciones se pondrían grandes y feas a toda prisa. También podría tener problemas con la circularidad. – TechZen

+0

Me encontré con situaciones en las que las vistas de iPad necesitan ver más de una entidad para mantener el estado. De ahí proviene la idea originalmente. –

+0

Yo estaría a favor de una secundaria o subclase. Cuanta más complejidad agregue a la clase base, más tendrá que administrar y depurar. – TechZen

Cuestiones relacionadas