2011-09-23 14 views
16

Diciamo che ho due entità, dipendente e reparto. Un reparto ha una relazione a molti con il dipendente, molti dipendenti possono trovarsi in ogni dipartimento ma ogni dipendente appartiene a un solo dipartimento. Voglio visualizzare tutti i dipendenti in una vista tabella ordinata per dati che è una proprietà del dipartimento a cui appartengono utilizzando un NSFetchedResultsController. Il problema è che voglio che la mia tabella si aggiorni quando un oggetto del dipartimento riceve le modifiche proprio come fa se cambiano le proprietà regolari dei dipendenti, ma FetchedResultsController non sembra tracciare gli oggetti correlati. Ho ottenuto superato questo problema parzialmente facendo quanto segue:NSFetchedResultsController con relazione non aggiornata

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

/* Make Changes to department object */ 

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

Questo ovviamente non è l'ideale ma fa sì che il dipendente in base metodo di FRC delegato didChangeObject ottenere chiamato. Il vero problema che ho lasciato ora è nelle ordinamento di un FRC che sta rintracciando gli oggetti dipendenti:

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

Questa grande opera e ordina i dipendenti correttamente la prima volta si chiama, il problema è che quando faccio le modifiche a un reparti someProperty che dovrebbe cambiare l'ordinamento del mio tavolo dei dipendenti non succede nulla. C'è un buon modo per avere il mio dipendente FRC tenere traccia delle modifiche in una relazione? In particolare, ho solo bisogno di un modo per aggiornare l'ordinamento quando l'ordinamento è basato su una proprietà correlata. Ho esaminato alcune domande simili ma non sono riuscito a trovare una soluzione soddisfacente.

risposta

16

Il NSFetchedResultsController è progettato solo per guardare un'entità alla volta. Il tuo setup, mentre ha senso, è un po 'al di là di ciò che lo NSFetchedResultsController è attualmente in grado di guardare da solo.

La mia raccomandazione sarebbe quella di impostare il proprio osservatore. Puoi basarlo su ZSContextWatcher che ho impostato su GitHub o puoi renderlo ancora più semplice.

In pratica, si desidera guardare i post NSManagedObjectContextDidSaveNotification e quindi ricaricare la tabella quando si attiva uno che contiene l'entità reparto.

Si consiglia inoltre di archiviare uno rdar con Apple e di richiedere il NSFetchedResultsController da migliorare.

+0

Non è sicuro che vorresti impostare un FRC per guardare più di un'entità alla volta. Le permutazioni diventerebbero grandi e brutte in fretta. Potresti anche avere problemi con la circolarità. – TechZen

+0

Ho attraversato situazioni in cui le visualizzazioni iPad hanno bisogno di guardare più di un'entità per mantenere lo stato. È qui che l'idea è nata originariamente. –

+0

Sarei favorevole a una secondaria o sottoclasse. Più complessità aggiungi alla classe base, più devi gestire e eseguire il debug. – TechZen

Problemi correlati