0

我有UISearchBar,并尝试追加一些过滤器在我的基地,但是当我试图重新加载我的NSFetchedResultsController与新谓词有时重新包含约10秒(一个谓词)和其他时间只有2秒这一谓语。在Predicates中使用的Core Data中的所有属性都被编入索引。 为什么发生这种情况以及如何解决这个问题?如何重新加载NSFetchedResultsController与新的过滤器在后台线程谓词?

fetchResultController代码

lazy var context: NSManagedObjectContext = { 
    let appDelegate = (UIApplication.shared.delegate as? AppDelegate) 
    return appDelegate!.managedObjectContext 
}() 

lazy var fetchedResultsController: NSFetchedResultsController<CardsBaseClass> = { 
    let fetchRequest = NSFetchRequest<CardsBaseClass>(entityName: "CardsBase") 
    let sortDescriptor = NSSortDescriptor(key: "cardName", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor] 

    fetchRequest.fetchBatchSize = 50 
    fetchRequest.returnsObjectsAsFaults = false 

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.context, sectionNameKeyPath: nil, cacheName: nil) 
    fetchedResultsController.delegate = self 
    return fetchedResultsController 
}() 

的UISearchBar方法

func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { 
    block?.cancel() 
    var predicateArray = predicateArrayClass.arrayOfPredicates 
    block = DispatchWorkItem { 
     let predicate = NSPredicate(format: "\(self.searchPredicateName) contains[c] %@", searchText) 
     predicateArray.append(predicate) 
     self.fetchedResultsController.fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicateArray) 
     print(self.fetchedResultsController.fetchRequest.predicate) 
     self.connectFetchedRequest() 
     DispatchQueue.main.async(execute: { 
      self.tableView.reloadData() 
     }) 
    } 
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.5, execute: block!) 
} 

回答

0

您不能运行在主线程核心数据管理对象上下文在后台线程。

在核心数据中使用后台线程时,最好使用框架本身而不是GDC或DispatchQueue API。核心数据提供了块API和父级和子级上下文的概念。我认为在你的代码中你违反了这些API的主要原则:总是在自己的线程上运行不同的上下文,反之亦然:不要在多个线程上运行任何上下文。

我建议创建一个子上下文并使用performBlock来进行搜索。

+0

我添加了MOC孩子但它没有帮助,写新的问题http://stackoverflow.com/questions/40712137/filtering-nsfetchedresultcontroller-via-searchbar-without-loading-base-pauses – Skie

相关问题