Сортировка объектов по возвращаемому значению метода - PullRequest
1 голос
/ 29 июня 2011

Недавно я столкнулся с некоторыми проблемами при попытке отсортировать набор объектов.

Объекты, которые я хочу отсортировать, являются подклассами NSManagedObject.
Я хочу отсортировать объекты по global_index, который, однако, не является свойством в моей модели. Это просто геттер -(NSInteger)globalIndex {...}, который реализует каждый из объектов. Внутри этого метода я делаю некоторые сложные вычисления, которые нельзя выполнить с помощью простого дескриптора сортировки.

Теперь мой вопрос: есть ли способ заставить NSSortDescriptor отсортировать объекты по возвращаемому значению метода?

Я действительно хочу использовать дескриптор сортировки, потому что это (IMO) единственный способ использовать интересные функции NSFetchedResultsController. Или есть способ сообщить контроллеру, как сортировать извлеченные объекты? Как ...
- (NSArray *)sortObjects:(NSSet *)objects {...}

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 29 июня 2011

Согласно Руководству по программированию базовых данных ,

Хранилище SQL, с другой стороны, компилирует предикаты и сортирует дескрипторы в SQL и оценивает результат в самой базе данных. Это делается главным образом для повышения производительности, но это означает, что оценка происходит в среде, не относящейся к Какао, и поэтому дескрипторы сортировки (или предикаты), которые полагаются на Какао, не могут работать. Поддерживаются следующие селекторы sort: и caseInsensitiveCompare :, localizedCompare :, localizedCaseInsensitiveCompare: и localizedStandardCompare: (последний - сортировка по типу Finder, и то, что большинство людей должны использовать большую часть времени) Кроме того, вы не можете сортировать переходные свойства, используя хранилище SQLite.

Простой обходной путь - сохранить порядок с каждым объектом (что является проблемой, когда вам нужно вставить объект между двумя другими, но это проблема с попыткой реализовать эффективную упорядоченную коллекцию в базе данных).

1 голос
/ 29 июня 2011

Вы пробовали просто передать @"globalIndex" в качестве ключа дескриптора сортировки? Это должно работать нормально, так как есть ключ для этого ключа.

0 голосов
/ 29 июня 2011

Вы должны быть в состоянии «обмануть» NSSortDescriptor, используя ваш метод глобального индекса, как и любой обычный метод доступа (метод доступа должен соответствовать ожиданиям Программирование значения ключа ).Другими словами, рассматривайте globalIndex как свойство ваших подклассов NSManagedObject и используйте в каждом из них следующие методы:

-(NSInteger) globalIndex {
    ...
}


-(void) setGlobalIndex: (NSInteger) idx {
    ...
}

Чтобы еще проще, вы можете определить подклассNSManagedObject с вашими дополнительными методами и расширьте ваши подклассы от этого (или создайте категорию , в любом случае).Должно работать нормально.

...