2010-02-07 13 views
10

Sto utilizzando Core Data nella mia prima applicazione iPhone e sto cercando di capire NSFetchedResultsController. Funziona alla grande nella mia vista principale. Devo istanziare un'istanza in ognuno dei miei controller di visualizzazione? Se è così, c'è un modello che rende questo facile come lo era nel mio controller di root (ho appena controllato una casella nel modello durante la creazione del progetto). Quando aggiungo un nuovo controller di visualizzazione, non vedo un'opzione per utilizzare i dati principali.Dovrei avere un NSFetchedResultsController in ogni vista?

Aggiornamento: Anche dopo aver tagliato/incollato il codice nella mia seconda vista, mi ci è voluto un po 'per capire che avevo anche bisogno di impostare il managedObjectContext prima di passare alla nuova visualizzazione. Ho aggiunto la seguente riga alla mia RootViewController prima di spingere la nuova vista sullo stack di navigazione:

self.newVC.managedObjectContext = self.managedObjectContext; 

risposta

11

Se gli altri punti di vista sono la visualizzazione di diversi Enti, allora sì, si può usare un diverso NSFetchedResultsController. In pratica puoi fare a meno di copiare e incollare il codice dal controller di visualizzazione radice generato automaticamente per gli altri controller di visualizzazione ... basta cambiare il nome dell'entità.

Tuttavia, se le altre viste (tabella) verso il basso della gerarchia visualizzano solo attributi diversi della stessa entità, è più efficiente/più semplice passare semplicemente l'oggetto esistente NSFetchedResultsController lungo la gerarchia. Basta creare un membro NSFetchedResultsController nell'interfaccia di classe ed esporlo come una proprietà nel file .h del controller di visualizzazione, quindi sintetizzare la proprietà e rilasciarla nel suo file .m. Quindi imposta la proprietà prima di spingere il controller della vista in pila.

+0

Grazie. Sto visualizzando una diversa entità. XCode fa qualcosa per renderlo più facile, o devo davvero tagliare/incollare quel codice per ogni vista? So che non è un grosso problema, ma devo prendere le definizioni dall'intestazione e l'implementazione dal file m. Tipo di dolore –

+0

Devi davvero tagliare e incollare per ogni vista. O quello, o crea un'altra classe per astrarre l'interazione con il controller dei risultati recuperati. L'ho provato una volta, però, e sarei stato molto meglio solo a gestire direttamente il controller dei risultati recuperato. – kubi

+0

Come dice kubi, l'astrazione di alcuni dettagli qui può o potrebbe non essere efficiente, a seconda del numero di entità diverse che è necessario visualizzare. Se è 2 o 3, copia e incolla. Se è 10, forse l'astrazione inizia a farti risparmiare tempo. O forse se questo codice verrà riutilizzato molto più tardi, ciò suggerisce anche di tenerlo pulito dall'inizio. Sii pragmatico qui e fai la chiamata in base al tuo dominio e alle tue esigenze, e non una stretta osservanza del principio DRY. –

3

vorrei aggiungere che se si utilizza più NSFetchedResultsControllers per la stessa entità, ma in tabelle diverse, tua UITableView non sarà aggiornato se si inseriscono i dati per la stessa entità usando un altro controller. Questo perché UITableView non riceverà i messaggi willChangeContent, etc da un NSFetchedResultsController per il quale non ti sei impostato come delegato.

+0

Sono stato appena morso da quello. Non sono sicuro che la loro condivisione ne valga davvero la pena - di solito è abbastanza semplice crearne una nuova e non doversi preoccupare di cose come questa. –

+0

@Alex stone Potresti aiutarmi nella mia situazione attuale. – Dinakar

+0

@Alex Potresti aiutarmi nella mia situazione attuale. Ho una tabellaView in un ViewController e sto riutilizzando viewContoller per alcuni moduli nella mia applicazione. Riuso il TableView ma fetchController dovrebbe essere una nuova istanza. Quando ho provato a implementare questa app in modo anomalo, "Incongruenza interna". Poiché tableView contiene le righe compilate dal precedente fetchresultController e devono rimuovere le righe e le sezioni compilate prima di caricare i dati utilizzando una nuova istanza di fetchController (i dati nei dati di base dovrebbero persistere e solo tableView deve essere aggiornato). Potresti aiutarmi in questo scenario .. – Dinakar

Problemi correlati