2010-04-30 13 views
7

¿Cómo podría usar NSFetchedResultsController con la clave de ordenación traducida y la secciónKeyPath?NSFetchedResultsSecciones de controlador localizadas ordenadas

Problema: Tengo ID en la propiedad "tipo" en la base de datos como tipoA, tipoB, tipoC, ... y no el valor directamente porque debe ser localizado. En inglés typeA = Bird, typeB = Cat, typeC = Dog en alemán sería Vogel, Katze, Hund.

Con un NSFetchedResultController con clave de ordenación y sectionKeyPath el "tipo" que recibe la orden y secciones - typeA - typeB - TypeC

A continuación traduzco para la exhibición y todo está bien en Inglés: - Bird - Cat - perro

Ahora me cambio a alemán y recibo una orden de clasificación errónea - Vogel - Katze - Hund

porque todavía ordena por typeA, typeB, TypeC

Así que estoy buscando una manera de localizar el tipo de la NSFetchedResultsController.

Probé el enfoque de propiedad transitoria, pero esto no funciona para la clave de clasificación porque la clave de clasificación debe estar en la entidad.

No tengo otra idea. Pero no puedo creer que no sea posible utilizar NSFetchedResultsController en un atributo derivado requerido para la localización.

Hay discusiones relacionadas como Using custom sections with NSFetchedResultsController? pero la diferencia es que los nombres de las secciones personalizadas y la clave de clasificación probablemente tengan el mismo orden. No en mi caso, y esta es la principal diferencia.

Al final necesitaría un orden de clasificación para el NSSortDescriptor necesario en un atributo derivado, supongo. Este orden de clasificación también debe servir para la sección KeyPath.

Gracias por cualquier pista.

Respuesta

3

bien, no es una buena solución, pero al final se está trabajando (porque tengo un conjunto limitado definido de registros Ca. 100):

En intializing la aplicación:

  • creo un atributo "ordenar por" en el objeto administrado.
    • Compruebo si la localización (y con ella el orden de clasificación) ha cambiado desde la última vez. Si es así:
    • Recojo todos los registros y los clasifico en un NSArray por nombres localizados.
    • que escribir de nuevo los registros en la tienda

Por razón del perfomance sólo traer y ordenar los registros según un NSPredicate.

Que puedo usar todo el código existente usando el "orden por" como la clave de clasificación y la ruta de la clave de sección.

Sé que podría usar mi matriz ordenada como fuente de datos para la vista de tabla, pero quería mantener el código existente y usar los métodos de NSFetchedResultsController.

Como conveniencia de esto tengo control total sobre la clasificación, que se ajustará a mis necesidades en el futuro ya que planeo crear un orden de clasificación más complejo (basado en ubicación, mayor probabilidad de uso de los registros en la parte superior, etc. .)

Sin embargo, no es una solución elegante.

0

Al final necesitaría un orden de clasificación para el NSSortDescriptor necesario en un atributo derivado, supongo.

Para la clasificación, una posibilidad sería hacer algo como:

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

donde translatedCompare es un método de comparación de escribir (como una categoría en NSString) que localiza los valores antes de compararlos.

No estoy seguro sobre cómo manejar la secciónKeyPath.

+0

Sí, he intentado esto hasta cierto punto. Pero para ser honesto, no pude convencer a NSString usando este método de comparación definida de categoría .... No esperaba que sectionKeyPath fuera un problema porque podría usar la propiedad transitoria aquí que debería coincidir con el orden de clasificación de la tipo localizado del descriptor de clasificación. – Gerd

+0

Le he dado otra oportunidad. Consulte la respuesta "Intenté de nuevo con la comparación personalizada ..." (Demasiado tiempo para un comentario). – Gerd

0

Supongo que el problema es causado por la caché.

Puede establecer la memoria caché con el nombre dado al crear el objeto NSFetchedResultsController utilizando el siguiente método. La última variable es el nombre de la memoria caché.

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

El NSFetchedResultsController utiliza la memoria caché para el cálculo de las secciones y el orden si existe el caché con el mismo nombre. Y la caché está escrita en el disco (no en la memoria).

Por lo tanto, si cambia el idioma entre inglés y alemán, debe eliminar la caché. Para eliminar la memoria caché, puede usar el método de clase deleteCacheWithName:.

Puede encontrar la información detallada aquí. http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref/doc/uid/TP40008227-CH1-SW24

+0

Gracias por su respuesta. Intenté esto, pero no noté la diferencia. El problema ocurre no solo al cambiar de un idioma a otro, sino que también ocurre si permanezco en una configuración de idioma. – Gerd

Cuestiones relacionadas