Разделы NSFetchedResultsController, локализованные отсортированный

Как я мог использовать 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.

Спасибо за любую подсказку.

7
задан Community 23 May 2017 в 10:30
поделиться

3 ответа

Хорошо, не очень хорошее решение, но в конце концов оно работает (потому что у меня есть определенный ограниченный набор записей около 100):

При инициализации приложения:

  • Я создаю атрибут «порядок по» в управляемый объект.
    • Я проверяю, изменилась ли локализация (а вместе с ней и порядок сортировки) с прошлого раза. Если так:
    • Я беру все записи и сортирую их в массиве NSArray по локализованным именам.
    • Я записываю обратно записи в хранилище

Из соображений производительности я только получаю и сортирую записи в соответствии с NSPredicate.

Тогда я могу использовать весь существующий код, используя «порядок по» в качестве ключа сортировки и пути ключа раздела.

Я знаю, что могу использовать свой упорядоченный массив в качестве источника данных для представления таблицы, но я хотел сохранить существующий код и использовать методы NSFetchedResultsController.

Для удобства у меня есть полный контроль над сортировкой, которая будет соответствовать моим потребностям в будущем, поскольку я планирую построить более сложный порядок сортировки (на основе местоположения, более высокая вероятность использования записей вверху и т. Д.) )

Однако это не изящное решение.

3
ответ дан 7 December 2019 в 16:40
поделиться

Думаю, в конце мне понадобится порядок сортировки для необходимого NSSortDescriptor в производном атрибуте.

Для сортировки можно сделать что-то вроде:

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

где translatedCompare - это метод сравнения, который вы пишете (как категория в NSString), который локализует значения перед их сравнением.

Не знаю, как обрабатывать sectionKeyPath.

0
ответ дан 7 December 2019 в 16:40
поделиться

Я предполагаю, что проблема вызвана кешем.

Вы можете установить кэш с заданным именем при создании объекта 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

0
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: