An extension that allows you to setup an NSFetchResultsConttroller
as a UITableViewDataSource
or UICollectionViewController
in a single line of code.
self.tableView.dataSource = self.fetchedResultsController
All edits to CoreData will be reflected automatically in any relevent UITableView
s or UICollectionView
s.
class BookshelfTableViewController: UITableViewController {
lazy var fetchedResultsController = { () -> NSFetchedResultsController<Book> in
let request = NSFetchRequest<Book>(entityName: "Book")
request.sortDescriptors = [ NSSortDescriptor(key: "title", ascending: true) ]
let context = NSPersistentContainer.shared.viewContext
let fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try! fetchedResultsController.performFetch()
fetchedResultsController.delegate = self
return fetchedResultsController
}()
// MARK: - UITableViewDelegate methods
override func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
let document = fetchedResultsController.object(at: indexPath)
cell.textLabel!.text = document.title ?? "Untitled"
cell.detailTextLabel!.text = document.subject
cell.imageView!.image = document.image
}
// MARK: - UIViewController methods
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.tableView.dataSource = fetchedResultsController
fetchedResultsController.swipeToDelete = true
}