也许某人有使用大型核心数据库的经验(我的基础上有32k行,我需要向用户显示所有这些基础并在其中进行一些搜索)并且当我尝试阅读时我的fetchedResultsController的基础我有3-5秒的延迟,我怎么能解决这个问题? 我可以在一些后台线程中阅读此基础吗? 或者,如果我通过关系将某些部分分开来,那会有帮助吗? 我尝试在viewDidAppear中加载我的基础
override func viewDidAppear(_ animated: Bool) {
DispatchQueue.main.async {
self.connectFetchedRequest()
self.tableView.reloadData()
self.indicatorLoad.stopAnimating()
}
}
func connectFetchedRequest() {
do {
try self.fetchedResultsController.performFetch()
}catch {
print(error)
}
}
在基础中搜索我使用UISearchBarDelegate方法(但是当我向searchText添加字符时仍然有一些“滞后”)
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
block?.cancel()
block = DispatchWorkItem {
let predicate = NSPredicate(format: "cardName contains[c] %@", searchText)
self.fetchedResultsController.fetchRequest.predicate = predicate
self.connectFetchedRequest()
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
}
DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + 0.5, execute: block!)
}
我使用以下代码创建了fetchedResultsController
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
}()
用于从其他viewController添加新谓词(我打开.overFullScreen所以我的主视图也打开了)我使用以下代码
predicateArrayClass.addPredicate(predicate: predicateType)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateTableViewByNewPredicate"), object: nil, userInfo: nil)
self.dismiss(animated: true, completion: nil)
我调用了更新fetchResultController func
func updateTableViewByNewPredicate() {
searchController.searchBar.text! = ""
let predicateArray = predicateArrayClass.arrayOfPredicates
block = DispatchWorkItem {
self.fetchedResultsController.fetchRequest.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: predicateArray)
self.connectFetchedRequest()
DispatchQueue.main.async(execute: {
self.tableView.reloadData()
})
}
DispatchQueue.global(qos: .background).async(execute: block!)
}
答案 0 :(得分:1)
以下是一些指导原则:
fetchBatchSize
设置为50
和returnsObjectsAsFaults
至NO
。estimatedRowHeight
的{{1}}或-tableView:estimatedHeightForRowAtIndexPath:
都可以。这将阻止在每次重新加载时将所有32K记录加载到内存中。
答案 1 :(得分:1)
这不是因为你有32k的记录。那不大。问题是您显然正在尝试使用字符串属性对这些记录进行排序:
let sortDescriptor = NSSortDescriptor(key: "cardName", ascending: true)
按字符串值对32k记录进行排序是很多工作。这需要时间。加速它有几种可能性: