3

我有一个由 NSFetchedResultController 管理的 tableview。由于我想获取最近添加的记录,我将控制器设置如下:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:NO];
request.sortDescriptors = [NSArray arrayWithObject:descriptor];
request.fetchLimit = 100;

因此,结果将按时间降序排列。但我也希望将结果按时间升序放置在 tableview 中。
我如何重新排序结果?

将结果放入另一个数组并重新排序并在每次更新获取结果后执行相同的操作?

4

2 回答 2

1

把你的结果放在一个数组中......然后如果你想反转它,设置 Ascending YES,反转你的数组:

NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];

我相信这是最简单的方法,不要一直抓取!

于 2012-07-20T20:16:47.007 回答
0

您的谓词将结果集限制为时间戳大于或等于 someDay 的实体。

您的排序描述符通知 fetch 请求应该检索哪些记录,以及按指定的顺序实际排序/呈现它们。

您的提取限制规定将返回不超过 100 个实体。

如果您有 1000 个匹配项,并且 sortAscending 为 YES,那么您将取回比 timeStamp 新的最旧记录,然后是第二旧的记录。如果 sortAscending 为 NO,那么您将取回比 timeStamp 更新的最新记录,然后是第二个最新记录,返回到比 timeStamp 更新的最旧记录(直到您达到第 100 个最旧的记录,如果它存在)。

UIableViews 和 NSFetchedResultsControllers 非常自然地协同工作。只要您不竭尽全力改变处理 NSIndexPaths 的方式,当您有一个带有获取结果控制器支持的表视图时,您基本上可以获得排序、部分和插入/删除操作。在这种情况下,无需尝试重​​新排序结果集 - 告诉 CoreData 你想要什么、多少以及以什么顺序,你就会得到它。

要使您的结果(尽我所知)您所期望的,您只需修改您的排序描述符以反映您实际希望如何对记录进行排序。在这种情况下,将升序设置为 YES:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"timeStamp >= %@",someDate];
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"timeStamp" ascending:YES];
request.sortDescriptors = [NSArray arrayWithObject:descriptor];
request.fetchLimit = 100;

那应该这样做。在这种情况下,无需对集合进行反向排序。

于 2012-07-20T21:46:13.093 回答