2011-07-15 3 views
13

Sto utilizzando un NSFetchedResultsController per gestire un UITableView e tutto funziona correttamente e l'ho trovato molto potente, specialmente in combinazione con il delegato dei risultati. Per eseguire il drill down della tabella sto riutilizzando la stessa classe controller, che viene istanziata con i parametri facendo clic su una riga di celle, il controller viene quindi inviato a UINavigationController e viene creata un'altra vista tabella, sempre con un NSFetchedResultsController.Uso corretto di NSFetchedResultsController cache

A questo punto, ogni controller ha una propria cache e il nome della cache è derivato con un identificatore univoco [NSString stringWithFormat "cacheName _% @", uniqueStringForCell], e alla fine posso ovviamente avere molti cache.

Ora le domande.

1) Avere molte cache può essere un problema?

2) Quando dovremmo usare una cache?

3) In caso di deleteCacheWithName, dove è il posto migliore per mettere tale metodo? Ho provato in viewWillDisappear, ma con questo suppongo di poter avere problemi quando la vista verrà visualizzata di nuovo e la cache non è più presente, ad esempio quando si utilizza con un UINavigationController. Probabilmente il metodo dealloc è il posto migliore?

4) Qual è la relazione tra una cache e la gestione della memoria? Voglio dire, quando viene inviato un (void)ReceiveMemoryWarning devo cancellare la cache? Se sì, che ne dici di ricostruirlo di nuovo? Qual è il modo preferito, forse riemettere il recupero?

5) il controller di recupero ha il suo delegato impostato su UITableViewController (fetchController.delegate = self), c'è qualche problema con questo? In un certo senso, in caso di modifica vengono avvisati più di un controller? E deleteCacheWithName rimuove anche il delegato?

grazie

risposta

11

Per rispondere (alcune) le vostre domande:

1) Avere più cache non è un problema. Infatti, dal riferimento di classe di Apple:

  • Se si dispone di più risultati recuperati controller con diverse configurazioni ( diversi descrittori di ordinamento e così via), è necessario dare ciascuna un nome della cache diversa.

Ho riscontrato problemi con le app precedenti in cui non l'ho fatto solo per ottenere un'eccezione che ho perso tempo cercando di risolvere.

2) Si suppone che utilizzeremo la cache per archiviare qualsiasi lavoro ripetuto che NSFetchedResultsController deve eseguire. Ogni volta che la sezione o le informazioni di ordinazione cambiano, la cache viene aggiornata. Allo stesso modo, se la cache non è coerente con le informazioni correnti nel database (hai aggiunto una nuova riga, cancellata, ecc.) Il controllore rilascia la cache e la cancella.

3) Ho inserito personalmente deleteCacheWithName nel metodo viewDidUnload. Non sono sicuro se questo sia il posto migliore o meno.

Non sono sicuro di 4. In termini di ricostruzione della cache, ciò dovrebbe avvenire automaticamente se la cache corrente non è sincronizzata con l'app. Non ho fatto nulla di specifico per la gestione della memoria e la cache su nessuna delle mie app.

5) Questo non dovrebbe essere un problema. Anche in questo caso, dalla documentazione di Apple:

  • Se si imposta un delegato per un controller risultati inverosimile, il controller registri per ricevere le notifiche di modifica dalla sua gestito contesto dell'oggetto . Qualsiasi modifica nel contesto che influisce sul set di risultati o sulla sezione viene elaborata e i risultati vengono aggiornati di conseguenza . Il controllore notifica al delegato quando gli oggetti risultato cambiano posizione o quando le sezioni vengono modificate (vedere NSFetchedResultsControllerDelegate). In genere si utilizzano questi metodi per aggiornare la visualizzazione della vista tabella.

Cordiali saluti, ecco il link per la documentazione di Apple dev per questa classe: http://developer.apple.com/library/ios/#documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html

HTH