Несколько дескрипторов NSSortDescriptor не работают, когда 1-й дескриптор — NSDate

Я пытаюсь разделить данные на разделы по «recordDate», тогда для каждого раздела данные будут отсортированы по «elementName» в порядке возрастания. Ниже приведен текущий код (не работает):

NSManagedObjectContext *context = self.tankDatabase.managedObjectContext;
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Log"];
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"recordDate" ascending:NO], [NSSortDescriptor sortDescriptorWithKey:@"elementName" ascending:YES selector:@selector(localizedStandardCompare:)], nil];
request.predicate = [NSPredicate predicateWithFormat:@"ownedBy = %@", self.tank];


self.controller = [[NSFetchedResultsController alloc]
                                          initWithFetchRequest:request
                                          managedObjectContext:context
                                          sectionNameKeyPath:@"recordDate"
                                          cacheName:nil];

self.controller.delegate = self;

NSError *error;
BOOL success = [self.controller performFetch:&error];

Однако, когда я попытался использовать другие свойства для сортировки (например: elementName ASC, значение DESC и сгруппировать их по elementName), он работает так, как должен. Обратите внимание, что recordDate является типом Date в модели данных и NSDate в классе.

Также RecordDate содержит минуты и секунды, где его необходимо сгруппировать по этой детали.

Я пытался найти похожий случай по всему Интернету, но я не нашел никаких решений, которые работают. Что мне не хватает в моем коде? Или это просто баг Apple? Спасибо за ваше время и помощь.


person Aditya Wirayudha    schedule 15.08.2012    source источник
comment
Что произойдет, если вы удалите селектор из второго дескриптора сортировки? CoreData сортирует вещи в базе данных, поэтому у вас не может быть дескрипторов сортировки, использующих настраиваемые селекторы или компараторы.   -  person Lily Ballard    schedule 15.08.2012
comment
Если я уберу селектор, ничего не изменится.   -  person Aditya Wirayudha    schedule 15.08.2012


Ответы (2)


Я наконец-то понял:

По-видимому, это информация о субсекундах, которая также сохраняется в Core Data, что делает сравнение между датами (даже если сравниваемые даты имеют одну и ту же дату) не работает.

Итак, что я сделал, так это удалил информацию о субсекундах перед сохранением ее в Core Data:

self.recordDate = [NSDate dateWithTimeIntervalSinceReferenceDate:floor([recordDate timeIntervalSinceReferenceDate])];

Я надеюсь, что это может помочь любому, кто сталкивается с той же проблемой. Ваше здоровье!

person Aditya Wirayudha    schedule 16.08.2012

Да, если вы хотите, чтобы ваш дескриптор подсортировки (на основе elementName) срабатывал, вам нужны некоторые связи по отношению к recordDate, поэтому ваша идея усечения recordDate хороша. Фактически, во многих случаях информация NSDate усекается до ГГ:ММ:ДД, поэтому все события, относящиеся к одному и тому же дню, неразличимы.

Кроме того, часто только ваш sectionNameKeyPath должен быть «крупнозернистым», например, вы создаете новый переходный атрибут, удаляя информацию о секундах из recordDate и передаете THAT в NSFetchedResultsController как sectionNameKeyPath. Другими словами, вы можете продолжить с recordDate как есть...

Это было бы похоже на сортировку по фамилии (скажем, по возрастанию), где названия разделов — A, B, C, ..., Z.

person J Sreedhar    schedule 19.02.2014