NSFetchedResultsController是Core Data框架中的一个控制器类,它专门用于管理UITableView或UICollectionView与Core Data存储之间的数据交互。它提供了高效的数据获取、内存管理和变更通知机制。
func replaceFetchedResultsController(with newPredicate: NSPredicate?, newSortDescriptors: [NSSortDescriptor]?) {
let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "YourEntityName")
// 设置新的谓词
fetchRequest.predicate = newPredicate
// 设置新的排序描述符
fetchRequest.sortDescriptors = newSortDescriptors ?? [NSSortDescriptor(key: "defaultSortKey", ascending: true)]
// 创建新的fetched results controller
let newFRC = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: managedObjectContext,
sectionNameKeyPath: nil,
cacheName: nil
)
// 设置代理
newFRC.delegate = self
// 执行新的获取请求
do {
try newFRC.performFetch()
fetchedResultsController = newFRC
tableView.reloadData()
} catch {
print("Failed to fetch: \(error)")
}
}
func updatePredicate(newPredicate: NSPredicate?) {
guard let frc = fetchedResultsController else { return }
frc.fetchRequest.predicate = newPredicate
do {
try frc.performFetch()
tableView.reloadData()
} catch {
print("Failed to fetch with new predicate: \(error)")
}
}
原因:可能忘记调用performFetch()
或reloadData()
解决:确保在修改谓词或替换controller后执行获取并刷新表格
原因:频繁切换谓词导致大量数据重新加载
解决:
原因:旧的NSFetchedResultsController未被释放
解决:在替换前将旧的controller的delegate设为nil
fetchedResultsController?.delegate = nil
fetchedResultsController = newFRC
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
let predicate: NSPredicate?
if !searchText.isEmpty {
predicate = NSPredicate(format: "name CONTAINS[cd] %@", searchText)
} else {
predicate = nil
}
updatePredicate(newPredicate: predicate)
}
通过以上方法,你可以灵活地以编程方式切换UITableView的NSFetchedResultsController或其谓词,实现各种数据展示需求。