当第一个描述符是NSDate时,多个NSSortDescriptor不工作

时间:2012-08-15 09:55:00

标签: ios nsdate nsfetchedresultscontroller nsfetchrequest nssortdescriptor

我正在尝试将数据分成“记录日期”和“记录日期”。然后,对于每个部分,数据将按' 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是一个'日期'输入数据模型和类中的NSDate。

此外,recordDate包含分钟和分钟。需要将其分组到该细节的秒数。

我试图在整个互联网上搜索类似的案例,但我还没有找到任何可行的解决方案。我的代码中有什么错过的?或者它只是一个Apple bug?感谢您的时间和帮助。

2 个答案:

答案 0 :(得分:1)

我终于明白了:

显然,这也是保存在Core Data中的亚秒级信息,使日期之间的比较(即使被比较的日期共享完全相同的日期)不起作用。

所以我做的是在将子秒信息保存到Core Data之前删除它:

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

我希望这可以帮助任何面临同样问题的人。干杯!

答案 1 :(得分:0)

是的,如果你想要你的子分类描述符(基于elementName),那么你需要关于recordDate的一些联系,所以你截断recordDate的想法是好的。事实上,很多时候,NSDate信息被截断为YY:MM:DD,因此属于同一天的所有事件都难以区分。

顺便说一句,通常只有你的sectionNameKeyPath需要“粗粒度”,例如,你通过从recordDate中删除亚秒信息来创建一个新的transient属性,并将THAT作为sectionNameKeyPath提供给NSFetchedResultsController。换句话说,你可以继续使用recordDate ......

这类似于姓氏排序(Ascending,比如说),其中节名称是A,B,C,...,Z。