2010-04-30 12 views
7

Come è possibile utilizzare NSFetchedResultsController con la chiave di ordinamento tradotta e sectionKeyPath?NSFetchedResultsController sezioni localizzate ordinate

Problema: Ho ID nella proprietà "tipo" nel database come tipoA, tipoB, tipoC, ... e non direttamente il valore perché dovrebbe essere localizzato. In inglese typeA = Bird, typeB = Cat, typeC = Dog in tedesco sarebbe Vogel, Katze, Hund.

Con un NSFetchedResultController con chiave di ordinamento e sectionKeyPath sul "tipo" ricevo l'ordine e le sezioni - typeA - typeB - TypeC

Successivo traduco per la visualizzazione e tutto è bene in inglese: - Bird - Cat - Cane

Ora posso passare al tedesco e ricevere un ordinamento sbagliato - Vogel - Katze - Hund

perché ancora ordina per tipo A, tipoB, tipoC

Quindi sto cercando un modo per localizzare l'ordinamento per NSFetchedResultsController.

Ho provato l'approccio di proprietà transiente, ma questo non funziona per la chiave di ordinamento perché la chiave di ordinamento deve essere nell'entità.

Non ho altra idea. Ma non posso credere che non sia possibile usare NSFetchedResultsController su un attributo derivato richiesto per la localizzazione?

Ci sono discussioni correlate come Using custom sections with NSFetchedResultsController? ma la differenza è che i nomi delle sezioni personalizzate e la chiave di ordinamento hanno probabilmente lo stesso ordine. Non nel mio caso e questa è la differenza principale.

Alla fine avrei bisogno di un ordinamento per il NSSortDescriptor necessario su un attributo derivato, immagino. Questo ordinamento deve anche servire per la sezioneKeyPath.

Grazie per qualsiasi suggerimento.

risposta

3

OK, non è una bella soluzione, ma alla fine si sta lavorando (perché ho un insieme limitato definito di record circa 100):

Sulla INIZIALIZZA dell'app:

  • creo un attributo "ordina per" nell'oggetto gestito.
    • Controllo se la localizzazione (e con essa l'ordinamento) è cambiata dall'ultima volta. In tal caso:
    • Ho recuperato tutti i record e li ho ordinati in un NSArray con nomi localizzati.
    • scrivo di nuovo i record nel negozio

Per motivi di performance Ho solo prendere e ordinare i record in base a un NSPredicate.

Quindi è possibile utilizzare tutto il codice esistente utilizzando "ordina per" come chiave di ordinamento e percorso chiave della sezione.

So che potrei usare il mio array ordinato come origine dati per la vista tabella, ma volevo mantenere il codice esistente e utilizzare i metodi di NSFetchedResultsController.

Come comodità, ho il controllo completo sull'ordinamento, che si adatta alle mie esigenze in futuro poiché ho intenzione di creare un ordinamento più complesso (posizione basata, maggiore probabilità di utilizzo dei record nella parte superiore, ecc. .)

Tuttavia non è una soluzione elegante.

0

Alla fine avrei bisogno di un ordinamento per il NSSortDescriptor necessario su un attributo derivato, immagino.

di smistamento, una possibilità potrebbe essere quella di fare qualcosa di simile:

[NSSortDescriptor initWithKey:@"type" 
ascending:YES 
selector:@selector(translatedCompare:)] 

dove translatedCompare è un metodo di confronto che si scrive (come una categoria a NSString) che localizza i valori prima confrontandoli.

Non sono sicuro su come gestire la sezioneKeyPath.

+0

Sì, l'ho provato fino a un certo punto. Ma ad essere onesti, non ero in grado di convincere NSString usando questa categoria definita confrontare metodo .... non mi aspettavo sectionKeyPath è un problema perché ho potuto utilizzare la proprietà transitoria qui che dovrebbe corrispondere il tipo di ordinamento della ordinamento localizzato dal descrittore di ordinamento. – Gerd

+0

Ho dato un altro tentativo. Si prega di fare riferimento alla risposta "Ho provato di nuovo con il confronto personalizzato ..." (troppo lungo per un commento). – Gerd

0

Immagino che il problema sia causato dalla cache.

È possibile impostare la cache con il nome specificato quando si crea l'oggetto NSFetchedResultsController utilizzando il seguente metodo. L'ultima variabile è il nome della cache.

- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name 

Il NSFetchedResultsController utilizza la cache per il calcolo delle sezioni e l'ordinamento, se la cache con lo stesso nome esiste. E la cache è scritta sul disco (non nella memoria).

Quindi, se si modifica la lingua tra inglese e tedesco, è necessario eliminare la cache. Per eliminare la cache è possibile utilizzare il metodo di classe deleteCacheWithName:.

Puoi trovare le informazioni dettagliate qui. http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

+0

Grazie per la risposta. Ho provato questo, ma non ho visto la differenza. Il problema si verifica non solo durante il passaggio da una lingua all'altra, succede anche se resto in un'impostazione della lingua. – Gerd

Problemi correlati