NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行
Posted
技术标签:
【中文标题】NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行【英文标题】:NSFetchedResultsController: Two sort descriptors with the same key not working. One descending for sections, the other ascending for rows 【发布时间】:2013-11-22 17:48:56 【问题描述】:我使用 NSFetchedResultsController 来填充 TableView。我希望这些部分按日期降序排序,行按日期升序排序。两者都使用键“creation”,并且这些部分具有 sectionNameKeyPath 的瞬态属性,该属性返回日期的字符串,格式为:“Today, Yesterday, 20.11.2013, 19.11.2013, ...”从“creation”日期创建.但是,这些行始终按照第一个排序描述符的顺序进行排序。这种做法有错吗?
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Exercise"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:NO],
[NSSortDescriptor sortDescriptorWithKey:@"creation" ascending:YES]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.context
sectionNameKeyPath:@"localizedCreationDate"
cacheName:nil];
感谢您提供的任何帮助! br
更新
上述方法行不通。 :) 我通过将第二个日期保存为当天开始的属性来解决它,按降序排列。这也用作 sectionNameKeyPath。此外,对于节标题,使用本地化创建日期。
- (void)setuptFetchedResultsController
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"DNALoggedExercise"];
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDayDate" ascending:NO],
[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.context
sectionNameKeyPath:@"creationDayDate"
cacheName:nil];
【问题讨论】:
【参考方案1】:在您的第一段代码中,您给出了两个相互矛盾的NSSortDescriptors
,因此只考虑了一个,并且可能是第一个。
为了方便而创建第二个日期属性,您将在数据库中引入数据重复,这不是一个好主意。
为什么不按任何顺序对结果进行排序,而只是在 cellForRowAtIndexPath
或 titleForHeaderInSection
中反向读取数组?更好的是,为什么不在 viewController 中使用一个小的私有方法来准备 NSDictionary 或任何其他方便的数据结构以供以后使用?
【讨论】:
我已经尝试过这种方法,但在插入/删除行时遇到了一些问题。一切都按预期进行,除了在删除每一行并再次添加一个实体时没有填充 TableVIew。但你是对的。这比数据重复要好,我会再试一次并报告结果。 :)以上是关于NSFetchedResultsController:具有相同键的两个排序描述符不起作用。一个降序用于部分,另一个升序用于行的主要内容,如果未能解决你的问题,请参考以下文章