问题描述
编辑:
向pbasdf大喊帮助我解决此问题。
固定代码:
lazy var fetchedResultsController = self.getFetchedResultsController()
var sectionKeyPath: String? = #keyPath(Object.sectionKey)
var searchPredicate: NSCompoundPredicate?
// MARK: - Return FRC:
private func getFetchedResultsController() -> NSFetchedResultsController<Object> { // var fetchedResultsController:
print("Lazy: getFetchedResultsController()")
let fetchRequest: NSFetchRequest<Object> = Object.fetchRequest()
fetchRequest.predicate = searchPredicate
let sortByKey = NSSortDescriptor(key: #keyPath(Object.sectionKey),ascending: true)
let sortByName = NSSortDescriptor(key: #keyPath(Object.name),ascending: true)
fetchRequest.sortDescriptors = [sortByKey,sortByName]
fetchRequest.fetchBatchSize = 20
let fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,managedobjectContext: coreDataStack.managedContext,sectionNameKeyPath: sectionKeyPath ?? nil,cacheName: nil)
fetchedResultsController.delegate = self
return fetchedResultsController
}
private func refreshFRC() {
fetchedResultsController = getFetchedResultsController() // Reset FRC
do { // Load Data:
try fetchedResultsController.performFetch()
} catch let error as NSError {
print("Fetching error: \(error),\(error.userInfo)")
}
}
这为您提供了带有可选谓词和sectionNameKeyPath的FRC。然后可以根据需要进行设置,然后使用refreshFRC()进行更改。
我正在使用NSFetchedResultsController将搜索添加到表视图中。 我的目标:
我有工作代码。而且我可以根据我的sectionKey来做这两个表,但我只是想不出如何在同一个版本中做这两个表。
这是正常现象吗,我正在尝试通过更改FRC的sectionNameKeyPath和sortDescriptors来做一些不可能的事情吗?还是我只是想念什么?
private func getFetchedResultsController() -> NSFetchedResultsController<Object> {
let fetchRequest: NSFetchRequest<Object> = Object.fetchRequest()
let sortByKey = NSSortDescriptor(key: #keyPath(Object.sectionKey),ascending: true)
switch sectionKeyPath {
case nil:
fetchRequest.sortDescriptors = nil
fetchRequest.fetchBatchSize = 20
default:
fetchRequest.sortDescriptors = [sortByKey,sortByName]
fetchRequest.fetchBatchSize = 20
}
fetchRequest.sortDescriptors = [sortByKey,cacheName: nil)
fetchedResultsController.delegate = self
return fetchedResultsController
}
我也很好奇,对于整个viewController使用单个FRC更好,还是对整个对象列表使用一个FRC更好,而仅在搜索处于活动状态时才使用第二个?
func updateSearchResults(for searchController: UISearchController) {
let searchBar = searchController.searchBar
searchBar.barStyle = .default
switch searchBar.text?.count {
case nil:
searchPredicate = nil
sectionKeyPath = #keyPath(Object.sectionKey)
tableView.reloadData()
case 0:
searchPredicate = nil
sectionKeyPath = #keyPath(Object.sectionKey)
tableView.reloadData()
default:
sectionKeyPath = nil
guard let searchText = searchBar.text else { return }
setSearchPredicate(search: searchText)
}
fetchFRC()
tableView.reloadData()
} // End: updateSearchResults()
func fetchFRC() {
do {
try fetchedResultsController.performFetch()
} catch let error as NSError {
print("Fetching error: \(error),\(error.userInfo)")
}
}
解决方法
根据评论:
- 您需要在该
getFetchedResultsController
代码中的fetchFRC
之前重新调用updateSearchResults
;和 - 您需要将结果分配给在视图控制器中定义的
fetchedResultsController
var。