优化,减少核心数据请求与否?

时间:2012-02-01 20:57:32

标签: ios optimization core-data

我为这个问题的标题挣扎,很难总结成一个单行。我会尽量让它尽可能直截了当。

我正在开发一个应用程序,我在其中显示自定义UIView(图表)和带有数据的UITableView。 tableview中的每一行代表一个带有值的时间点,比如说它的账户余额。

tableview一次只显示3行,中间行充当“活动”行。活动行用于决定图表中显示的内容。具有时间戳的任何AccountBalance<图表中显示12小时前后。使图表显示24小时数据窗口。

这是我在桌面视图中滚动时,在优化和减少延迟方面难以确定什么是最佳设计方法的地方。基本上我有逻辑通过使用UIScrollView委托方法来确定哪一行在中间。这很好。

要确定要显示的数据,每次中间行更改时,我都会使用谓词执行NSFetchRequest(每次行更改时都会生成一个新请求)。完成后,我在图表视图上调用setNeedsDisplay并重新绘制它。

虽然到目前为止这在小型数据集上运行良好但我有一种直觉,我可以以某种方式利用Core Data的性能和缓存来更好地减少延迟。任何想法和想法都很受欢迎。

这可能不是一个普遍的问题而且对许多人没有兴趣,但我认为这里关于最佳实践的讨论可能适用于比我更多的情况,因此对更多人有价值。

1 个答案:

答案 0 :(得分:0)

您可能想要使用的是批量提取(NSFetchRequest允许您设置批量偏移和大小)。这正是NSFetchedResultsController用来确保一次只获取几个对象的内容。

您需要注意,要做出平衡:如果您有一个大批量(例如300行/对象),则强制CoreData一次创建300个对象(而不是更小)数)。但是,如果您将批量大小设置为小(例如3行/对象),您将付出高昂的代价,因为您最终会经常批量拉动(这非常昂贵)。

您必须进行测试才能看到适合您的批量大小,但它通常是您一次显示的对象数量的两倍。

打开批量提取时NSFetchRequest返回的数组(通过设置批量大小)将在您的背后做一些魔术,它只会在您遍历它时填充该数组。并且它只会在您当前使用的之前和之后将对象保留在内存中几个批次。

很容易滥用批量抓取并使速度变慢。例如。如果你有一个批量提取的数组,并且你有一些(破坏的)逻辑循环遍历所有对象,你最终会逐一拉入集合中的所有批次 - 打败批处理的目的取。