我有一个由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中 如何重新排序结果?
将结果放入另一个数组并重新排序并在每次更新获取结果后执行相同的操作?
答案 0 :(得分:1)
将结果放入数组......然后如果要反转它,设置Ascending YES,反转你的数组:
NSArray* reversedArray = [[startArray reverseObjectEnumerator] allObjects];
我相信这是最简单的方法,因为不是一直都在抓!
答案 1 :(得分:0)
您的谓词将结果集限制为timeStamp大于或等于someDay的实体。
您的排序描述符会通知获取请求应检索哪些记录,以及按指定的顺序对它们进行实际排序/显示。
您的获取限制表明将返回不超过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;
那应该这样做。在这种情况下,无需对集合进行反向排序。