NSFetchedResultsController和Searching-返回多个和单个部分



编辑:

向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)
let sortByName = NSSortDescriptor(key: #keyPath(Object.name), ascending: true)

switch sectionKeyPath {
case nil:
fetchRequest.sortDescriptors = nil
fetchRequest.fetchBatchSize = 20
default:
fetchRequest.sortDescriptors = [sortByKey, sortByName]
fetchRequest.fetchBatchSize = 20
}
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
}

我也很好奇,对整个viewController使用单个FRC是否更好,或者对整个对象列表使用一个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)")
}
}

根据注释:

  1. 您需要在该updateSearchResults代码中的fetchFRC之前重新调用getFetchedResultsController;以及
  2. 您需要将结果分配给视图控制器中定义的fetchedResultsController变量

最新更新