【发布时间】:2013-03-12 09:49:18
【问题描述】:
我正在使用NSFetchedResultsController 从核心数据结构中提取几千个结果并将它们显示在UITableView 中。我有一些可用的选项可以使用谓词执行提取并显示更新的数据,例如按关键字搜索、按作者排序等。
我想在显示之前随机打乱订单。我用shuffle 方法创建了一个NSArray 类别,该方法运行良好,但在[self.fetchedResultsController fetchedObjects] 上调用该方法无效,数据保持不变。我假设这是因为fetchedObjects 是readonly,我需要复制一份。
我已经制作了那个副本,但我遇到的问题是让这个新数组与fetchedObjects 数组和平共存。我可以转到各种详细视图并修改内容,因此我试图确定如何使fetchedObjects 和我的shuffledFetchedObjects 数组保持同步,即使它们的内容顺序不同。
这是我的简单小shuffle 类别:
- (NSArray *) shuffle {
NSMutableArray *tmp = [NSMutableArray arrayWithArray: self];
for (int i = [tmp count] - 1; i > 0; i--) [tmp exchangeObjectAtIndex: arc4random() % (i + 1) withObjectAtIndex: i];
return [NSArray arrayWithArray: tmp];
}
我有哪些选择来实现这一目标?
【问题讨论】:
-
您真的需要 FRC 吗?如果插入、删除或修改对象,FRC 可用于显示具有自动更新 的表视图。 - 如果插入一个新对象,你期望什么?它应该出现在表格视图的什么位置?
-
这里没有添加条目的方法,只是删除它们并将它们标记为收藏,然后排序等。
-
但是你不需要 FRC。只需使用
NSArray *results = [context executeFetch:request error:&error];获取结果,打乱results数组并将打乱的数组用作表格视图数据源。 -
如果我在
tableView上致电reloadData,这还会继续更新吗?我经常这样做。 -
我不太明白你的最后一个问题。
reloadData查询数据源方法numberOfRows...和cellForRow...,这些方法会从打乱后的数组中获取信息。
标签: objective-c core-data random nsarray nsfetchedresultscontroller