Можно ли использовать self с NSSortDescriptor для сортировки по самому объекту, а не по свойству объекта? (Основные данные/NSFetchedResultsController)

NSSortDescriptor имеет метод sortDescriptorWithKey:ascending:selector:.

Это берет сортируемый объект, находит свойство Key-Value Coding объекта для key, а затем отправляет это свойство указанному селектору.

Вместо этого я хотел бы отправить сам объект селектор, чтобы напрямую отсортировать объект одним из его методов.

Я попробовал ключ @"self", который не работает со следующей ошибкой:

[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)]; 

'NSInvalidArgumentException', причина: 'keypath #self не найден в объекте

Есть ли способ сортировки с использованием одного из методов объекта, а не одного из свойств?

(Кстати, я не могу использовать sortDescriptorWithKey:ascending:comparator: из-за Core Data. Это также будет использоваться с NSFetchedResultsController и делегатом.)

РЕДАКТИРОВАТЬ:

Полный код того, что я хотел бы сделать, с Core Data + NSFetchRequest:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"MYClass" inManagedObjectContext:ManagedObjectContext]];
[request setFetchBatchSize:20];

// This is where I am having the problem. Self?
NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES selector:@selector(compare:)];
[request setSortDescriptors:@[sortDescriptor]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hidden != %@", @YES];
[request setPredicate:predicate];

NSFetchedResultsController *newController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[[ATBackend sharedBackend] managedObjectContext] sectionNameKeyPath:@"sectionKeyPath" cacheName:@"myCache"];

newController.delegate = self;
_fetchedMessagesController = newController;

person pkamb    schedule 10.08.2015    source источник
comment
Что вы имеете в виду под сортировкой объекта по одному из его методов? Какова форма этого метода? Принимает ли он другой объект и что он возвращает? Он называется compare:? Если нет, пытались ли вы передать его селектор конструктору дескриптора сортировки? Что вы имеете в виду, когда говорите, что @"self" не работает? Что именно происходит и чем это отличается от того, что вы хотите?   -  person Ken Thomases    schedule 11.08.2015
comment
@KenThomases Метод будет соответствовать описанию в документах NSSortDescriptor (должен по сути соответствовать compare:). Но проблема, с которой я сталкиваюсь, заключается в объекте, которому я отправляю селектор, а не в самом селекторе. Хотите отправить на object, можете отправить только на object.property.   -  person pkamb    schedule 11.08.2015
comment
Вы до сих пор не сказали, что именно не работает, когда вы указываете @"self" и @selector(yourComparisonMethod:). Он работает в основном с дескрипторами сортировки. Может быть проблема с Core Data, но ее невозможно понять, пока вы не объясните, что происходит.   -  person Ken Thomases    schedule 11.08.2015
comment
@KenThomases Добавлено, спасибо.   -  person pkamb    schedule 11.08.2015


Ответы (1)


Вы можете использовать NSSortDescriptor с клавишей self, и она работает нормально.

Но если вы используете пользовательский класс, вы должны переопределить функции isEqual: и hash вашего класса.

Обновление основных данных:

В вашем случае метод, который я описал, может не работать, выглядит как NSFetchedResultsController, а массивы используют дескрипторы сортировки по-разному.

В Core Data ключевой путь NSSortDescriptor должен быть свойством/отношением Core Data вашего пользовательского класса NSManagedObject.

Я предлагаю вам создать отдельное свойство для вашего класса MYClass, называемое order числового или строкового типа, и обновлять его при изменении класса. Затем вы можете использовать это свойство для сортировки в NSFetchedResultsController.

person Vitalii Gozhenko    schedule 10.08.2015
comment
Но как это могло работать? В собственной документации Apple для этого метода указано, что тип параметра должен быть NSString. - person SevenBits; 11.08.2015
comment
Но вы отправляете его как параметр NSString, а он называется self. - person Vitalii Gozhenko; 11.08.2015
comment
[self.objects sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"self" ascending:YES]]]; Этот код работает как обычно с массивом objects, который является массивом NSDate объектов. - person Vitalii Gozhenko; 11.08.2015
comment
@SevenBits с ключом-значением, свойство представлено в виде строки developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ - person JordanC; 11.08.2015
comment
@JordanC Извините, это был долгий день. Я думал, что ОП спрашивал о передаче ключевого слова self методу. Упс... - person SevenBits; 11.08.2015
comment
@SevenBits Понедельник, чувак, я чувствую тебя. Однако этот ответ должен работать. Я удаляю свой. Последний шанс проголосовать ;) - person JordanC; 11.08.2015
comment
@VitaliyGozhenko Пожалуй, в паре с Core Data все хлопотнее. Когда я передаю @"self", я получаю: 'NSInvalidArgumentException', reason: 'keypath #self not found in entity <NSSQLEntity MYClass> - person pkamb; 11.08.2015
comment
Можете ли вы поделиться полным кодом о выборке из Core Data и использовании дескриптора сортировки? - person Vitalii Gozhenko; 11.08.2015
comment
@ВиталийГоженко Добавлено в ОП. - person pkamb; 11.08.2015