NSFetchedResultsController以不同的方式对不同的部分进行排序(升序/降序)?

时间:2012-06-10 04:27:44

标签: iphone objective-c ios sorting core-data

在我的应用中,我有一个任务列表(不,它不仅仅是另一个待办事项应用),而且我使用UITableViewNSFetchedResultsController中显示任务。以下是相关的初始化代码:

NSSortDescriptor *dueDateSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"due" YES];
NSSortDescriptor *completionSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"completed" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:completionSortDescriptor, dueDateSortDescriptor, nil]];

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"completed" cacheName:nil];

这样做是对任务进行排序,使得我在顶部有一个不完整的任务部分,首先将任务排在最前面,然后进一步减少任务。一切正常。

然而,这意味着第二部分(具有已完成任务的部分)也会按此方式排序,因此最早的到期任务位于顶部。我想要做的是更改它,以便第二部分以相反的顺序排序(按降序排列),但第一部分按升序排序。这甚至可能吗?我该怎么做呢?

为什么我要这样做:目前的工作方式,第二部分顶部的任务(因此也是最明显的)是很久以前完成的任务。用户更有可能希望查看最近完成的任务(如果意外检查,则取消选中一个),并且可能最近完成了具有更近期日期的任务。我很乐意在必要时为Core Data任务对象添加一个单独的完成日期字段(这还不是一个发货应用程序,所以我可以更改数据格式,但我喜欢)。

1 个答案:

答案 0 :(得分:3)

使用NSFetchedResultsController时无法执行此操作。您必须手动获取数据并实现UITableView的委托方法。

编辑:哇,我的错误,这是一个相当简单的解决方案。设置两个排序描述符:

  • completedDate的第一个(降序)。对于所有未完成的任务,此字段(nil)相同。

  • addedDate(升序)添加第二个。它将按完成日期排序(最新的第一个),但在第一部分中您将没有任何已完成的日期,因此它将使用添加的日期(最早的日期)。

对于第二部分,它将只使用completedDate(最新的第一部分),所以你去。