Как я мог использовать NSFetchedResultsController с переведенным ключом сортировки и sectionKeyPath?
Проблема: у Меня есть идентификатор в свойстве "тип" в базе данных как typeA, typeB, типы... а не значение непосредственно, потому что это должно быть локализовано. В английском typeA=Bird, typeB=Cat, typeC=Dog на немецком языке это был бы Vogel, Katze, Hund.
С NSFetchedResultController с ключом сортировки и sectionKeyPath на "типе" я получаю заказ и разделы - typeA - typeB - типы
Затем я перевожу для дисплея, и все прекрасно на английском языке: - птица - CAT - Собака
Теперь я переключаюсь на немецкий язык и получаю неправильный порядок сортировки - Vogel - Katze - Hund
потому что это все еще виды typeA, typeB, типами
Таким образом, я ищу способ локализовать вид для NSFetchedResultsController.
Я попробовал переходный подход свойства, но это не работает на ключ сортировки, потому что ключ сортировки должен быть в объекте.
У меня нет никакой другой идеи. Но я не могу полагать, что это не возможно использовать NSFetchedResultsController на полученном атрибуте, требуемом для локализации?
Существуют связанные обсуждения как Использование пользовательских разделов с NSFetchedResultsController? но различие - то, что пользовательские имена раздела и ключ сортировки имеют, вероятно, тот же порядок. Не в моем случае и это - основное различие.
В конце мне был бы нужен порядок сортировки для необходимого NSSortDescriptor на полученном атрибуте, я предполагаю. Этот порядок сортировки должен также служить для sectionKeyPath.
Спасибо за любую подсказку.
Хорошо, не очень хорошее решение, но в конце концов оно работает (потому что у меня есть определенный ограниченный набор записей около 100):
При инициализации приложения:
Из соображений производительности я только получаю и сортирую записи в соответствии с NSPredicate.
Тогда я могу использовать весь существующий код, используя «порядок по» в качестве ключа сортировки и пути ключа раздела.
Я знаю, что могу использовать свой упорядоченный массив в качестве источника данных для представления таблицы, но я хотел сохранить существующий код и использовать методы NSFetchedResultsController.
Для удобства у меня есть полный контроль над сортировкой, которая будет соответствовать моим потребностям в будущем, поскольку я планирую построить более сложный порядок сортировки (на основе местоположения, более высокая вероятность использования записей вверху и т. Д.) )
Однако это не изящное решение.
Думаю, в конце мне понадобится порядок сортировки для необходимого NSSortDescriptor в производном атрибуте.
Для сортировки можно сделать что-то вроде:
[NSSortDescriptor initWithKey:@"type"
ascending:YES
selector:@selector(translatedCompare:)]
где translatedCompare
- это метод сравнения, который вы пишете (как категория в NSString), который локализует значения перед их сравнением.
Не знаю, как обрабатывать sectionKeyPath.
Я предполагаю, что проблема вызвана кешем.
Вы можете установить кэш с заданным именем при создании объекта NSFetchedResultsController, используя следующий метод. Последняя переменная - это имя кеша.
- (id)initWithFetchRequest:(NSFetchRequest *)fetchRequest managedObjectContext:(NSManagedObjectContext *)context sectionNameKeyPath:(NSString *)sectionNameKeyPath cacheName:(NSString *)name
NSFetchedResultsController использует кэш для вычисления разделов и упорядочивания, если кэш с тем же именем существует. И кеш записывается на диск (а не в память).
Таким образом, если вы меняете язык с английского на немецкий, вам следует удалить кеш. Для удаления кеша вы можете использовать метод класса deleteCacheWithName:
.
Подробную информацию можно найти здесь. http://developer.apple.com/iphone/library/documentation/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html#//apple_ref / doc / uid / TP40008227-CH1-SW24