前言
网上看了很久,没发现有比我这篇更详细的。
如果学到或者查到 NSFetchedResultsController
,我猜50%大概你已经了解到了CoreData到底是有多么强大,Apple 设计了 CoreData 这么一整套这么完美的持久化框架,在减少代码量的同时,也极大程度上提高运行效率。
在我们的日常开发过程中,使用 Core Data 的时候经常经常会跟 TableView 打交道,为了更好的使得两者合作更加紧密,Apple 设计了 NSFetchedResultsController
。
NSFetchedResultsController
并不是 ViewController 的子类,它仅仅是一个 Controller,没有视图没有界面。
为了介绍它的伟大,举个例子你有 1000 条数据,1000个 Cell 来展示你的那些数据。如果你删除或者更新了一条数据,在数据库中就要执行相应操作,这个时候通过 NSFetchedResultsController 的 Delegate,会自动去更新那一条数据的UI,而且不是整体更新,而是针对那一条数据进行更新,极大的优化了执行效率。
而这一切,你“几乎”什么都不用做。
NSFetchedResultsController
的简单用法:
假设你的类已经加入了 CoreDataStack,如果没有的话看这里
1、数据展示
首先需要一个 iVar:
var fetchRequestsController : NSFetchedResultsController!
然后在 ViewDidLoad 或者根据你项目自己的架构或者封装来初始化:
super.viewDidLoad()
let fetchRequest = NSFetchRequest(entityName: "Team")
//给 FetchRequest 加入排序,FetchResultsController 的 FetchRequest 至少需要一个排序,不可为空
let sortDesctiptor = NSSortDescriptor(key: "teamName", ascending: true)
fetchRequest.sortDescriptors = [sortDesctiptor]
//FetchResultsController 就像是 CoreData 和 TableView 之间的助手一样,但是即便如此还是需要提供FetchRequest。
//初始化方法包含了四个参数,第一个就是 FetchRequest,第二个是上下文 Context,拿它来 executeFetchRequest,三四个参数是Optional,后面会详写。
fetchRequestsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: coreDataStack.context, sectionNameKeyPath: nil, cacheName: nil)
do {
try fetchRequestsController.performFetch()
} catch let error as NSError {