NSFetchedResultsController和搜索-返回多个和单个部分吗?

问题描述

编辑:

向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)")
    }
}

解决方法

根据评论:

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...