数据模型设计
- 合理分层:将数据按照逻辑关系分层,比如将基础信息和详细信息分不同实体存储。例如,一个电商应用,商品基本信息(名称、价格)放一个实体,商品详细描述、规格等放另一个实体,通过关系关联。这样查询基本信息时无需加载大量详细数据。
- 避免冗余:减少重复数据存储,确保数据一致性。如订单实体和商品实体,商品信息在商品实体存储,订单实体通过关系引用,而非在订单实体重复存储商品详细信息。
- 正确设置属性类型:根据数据实际情况选合适属性类型。例如日期时间用Date类型,避免用字符串存储,可提高存储效率和查询性能。
获取请求优化
- 限制返回属性:只请求需要的属性,而非获取所有属性。如查询用户列表只需要用户名和头像,在
NSFetchRequest
设置propertiesToFetch
。示例:
let fetchRequest: NSFetchRequest<User> = User.fetchRequest()
fetchRequest.propertiesToFetch = ["username", "avatar"]
fetchRequest.returnsDistinctResults = true
- 分页处理:对于大量数据,按页获取。设置
fetchLimit
指定每页数量,fetchOffset
指定偏移量。示例:
let fetchRequest: NSFetchRequest<Product> = Product.fetchRequest()
fetchRequest.fetchLimit = 20
fetchRequest.fetchOffset = pageIndex * 20
- 添加索引:对经常用于查询过滤的属性添加索引。例如用户表按手机号查询频繁,在手机号属性添加索引。在数据模型编辑器选中属性,勾选
Indexed
。
缓存策略
- 内存缓存:使用
NSCache
在内存中缓存经常访问的数据。例如在一个新闻应用中,缓存最近浏览新闻的实体。示例:
let newsCache = NSCache<NSString, News>()
func getNewsFromCache(withId id: String) -> News? {
return newsCache.object(forKey: id as NSString)
}
func cacheNews(_ news: News) {
newsCache.setObject(news, forKey: news.id as NSString)
}
- 磁盘缓存:可定期将内存缓存数据持久化到磁盘,下次启动应用时可快速加载到内存。如利用文件系统将缓存数据写入文件。可在应用进入后台时执行磁盘缓存操作。