如何在更新 tableview 时使用搜索栏对我的 NSFetchedResults 数据进行排序,而不会在 fetchedRC.performFetch() 上崩溃?更新

Posted

技术标签:

【中文标题】如何在更新 tableview 时使用搜索栏对我的 NSFetchedResults 数据进行排序,而不会在 fetchedRC.performFetch() 上崩溃?更新【英文标题】:How do I use a search bar to sort my NSFetchedResults data without it crashing on fetchedRC.performFetch(), while updating tableview? UPDATED 【发布时间】:2019-07-24 14:05:17 【问题描述】:

我的数据在尝试搜索之前加载良好,但是当我开始在搜索栏中输入时,它在调用 try fetchedRC.performFetch() 时崩溃

我尝试过谷歌搜索并更改代码,但似乎没有任何效果。

这是我从与 CoreData 中的数据的一对多关系中获取数据的设置。

func setupFetchedResultsController() 
    //fetchedRC = nil
    let request = Item.fetchRequest() as NSFetchRequest<Item>

    if !currentSearchText.isEmpty && !(currentSearchText == " ") 
        request.predicate = NSPredicate(format: "list.name CONTAINS[c] \(currentSearchText)", parentObj)
     else 
        request.predicate = NSPredicate(format: "list = %@", parentObj)
    

    //list CONTAINS[c] \(currentSearchText)
    let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)

    request.sortDescriptors = [sort]
    do 
        fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        try fetchedRC.performFetch()
        self.tableView.reloadData()
     catch let error as NSError 
        print(error.localizedDescription)
    
    fetchedRC.delegate = self

这是我的 updateSearchResults 函数

func updateSearchResults(for searchController: UISearchController) 
    guard let text = searchController.searchBar.text else  return 
    currentSearchText = text
    //fetchedRC = nil
    setupFetchedResultsController()

我已经设置好了,所以有一个父列表和许多子项目。我期望发生的事情是让孩子们看到包含用户在搜索栏中输入的内容。因此,当用户在搜索栏中输入更多内容时,它会更新和优化搜索。实际发生的是调用try fetchedRC.performFetch() 时它崩溃了。有什么方法可以解决这个问题?我也是使用 FetchedResultsController 执行此操作的新手。

这也是它在崩溃时给出的错误消息:CoreData: error: SQLCore dispatchRequest: exception handling request: &lt;NSSQLFetchRequestContext: 0x28180cee0&gt; , unimplemented SQL generation for predicate : (list CONTAINS[c] A) (LHS and RHS both keypaths) with userInfo of (null)

作为一个注释,我也知道request.predicate 中的list.name 是不正确的,我只是作为占位符这样做,希望它更容易理解。

【问题讨论】:

【参考方案1】:

我找到了我的问题的解决方案,希望这也可以帮助其他人解决这个问题。

func setupFetchedResultsController() 

    let request = Item.fetchRequest() as NSFetchRequest<Item>

    //This line simplified just to help it be more reliable
    if (currentSearchText.count > 0) 
        // Line Updated and Fixed Problem
        request.predicate = NSPredicate(format: "list = %@ && name CONTAINS %@", parentObj, currentSearchText)
     else 
        request.predicate = NSPredicate(format: "list = %@", parentObj)
    

    let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)

    request.sortDescriptors = [sort]

    do 
        fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
        try fetchedRC.performFetch()
        self.tableView.reloadData()
     catch let error as NSError 
        print(error.localizedDescription)
    

    fetchedRC.delegate = self

【讨论】:

以上是关于如何在更新 tableview 时使用搜索栏对我的 NSFetchedResults 数据进行排序,而不会在 fetchedRC.performFetch() 上崩溃?更新的主要内容,如果未能解决你的问题,请参考以下文章

如何在 tableView 行选择时更新我的​​ fetchedResultsController?

双击需要使用搜索栏选择 TableView 项目

基本视图 UI 导航栏对方向的响应

Swift 搜索栏 - 使用 Alamofire 请求更新表格视图

搜索时tableview错误

在快速键入期间使用搜索栏进行搜索时 TableView 崩溃