CoreData性能优化笔记

性能检测常用方法

sdq
Explore, Think, Create
2 min readMay 22, 2016

--

  1. Debug Session查看Memory状态
  2. 通过Instrument定位问题。
  3. 使用XCTest框架。measureMetrics(XCTPerformanceMetric_WallClockTime)可以测试代码执行的时间性能。

一些常见的优化内容

  1. 尽量设置fetchRequest的fetchBatchSize属性,否则默认为0,会在第一次加载时载入所有数据。一般经验是将fetchBatchSize的数量设置为屏幕显示数量的两倍。当滚动时会自动加载剩余的数据。
  2. 在写筛选条件(predicate)时要注意先后顺序,把限制更大的筛选条件放在优先位置会很好地提高筛选效率。比如,“(active == YES) AND (name CONTAINS[cd] %@)” 要优于 “(name CONTAINS[cd] %@) AND (active == YES)”
  3. 当仅需要获取查询数量的时候,使用countForFetchRequest直接查询数目,而非使用executeFetchRequest获取条目后,再拿条目的数量。
  4. 如果存在relationships,直接使用,避免重复查询。

多context问题

  1. 尽量避免多context,会导致调试困难,大部分情况下使用主context已经足够了。当需要处理耗时操作(比如导出数据)时,为了避免阻碍主线程,可以采用多context。这里不采用GDC将主context放入后台运行的原因是,coredata的context不是线程安全的,你不能用同一个context在多个线程内进行操作,此时唯一的方法是创建另一个context放入私有队列中来避免阻碍主线程更新UI等。
  2. 有时候在处理一些可能保存也可能丢弃的数据时,我们会使用到child context,他们通常作为一个临时的context存在,用于将最终的数据反馈给parent context。但这里要注意的是,child context在save时仅仅会将修改的内容传给它的parent context,而不是持久层,所以需要parent context进一步保存或处理。

--

--