如何重新排序获取的结果以进行显示?

Posted

技术标签:

【中文标题】如何重新排序获取的结果以进行显示?【英文标题】:How to reorder the fetched results for display? 【发布时间】:2012-07-20 19:19:37 【问题描述】:

我有一个由 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 中。 我如何重新排序结果?

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

【问题讨论】:

通过设置 sortDescriptor 升序 no ,它们将显示在表格中也升序 no 。这不是我想要的。(我希望它们按时间升序被放置在表中......) 为什么不运行两次呢?顺便说一句,如果你有一个 fetchLimit 100 recs,这不意味着你有一天会从 100 recs 中得到所有东西吗?因此,如果您想要相反的结果,那么您有一天会得到+100,但是如果有一天从现在开始有 1000 个记录距离,那么您将不会得到相同的记录。 @Panagiotis - 请参阅下面的答案。 【参考方案1】:

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

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

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

【讨论】:

【参考方案2】:

您的谓词将结果集限制为时间戳大于或等于 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;

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

【讨论】:

以上是关于如何重新排序获取的结果以进行显示?的主要内容,如果未能解决你的问题,请参考以下文章

如何对Access数据库查询结果进行重新编号排序啊,自动编号的方式也行

重新排序单元格后如何更改获取结果控制器数组中对象的顺序

如何刷新/重新加载以更新对谓词的更改并因此获取请求?

如何以编程方式根据排序标准对单元格重新排序 SWIFT 4

如何使用弹性框重新排序 div?

如何根据数据属性对div进行排序,并更改下拉列表