也許有人有大型核心數據庫的工作經驗(我在我的基礎中有32k行,我需要向用戶展示所有這些基礎並在其中進行一些搜索),當我嘗試讀取基地到我fetchedResultsController我有3-5秒的延遲,我該如何解決這個問題? 我可以在一些後臺線程中讀取這個基地嗎? 或者如果我通過關係將部分零件分離出來,對它有幫助嗎? 我嘗試在viewDidAppear通過fetchedResultsController在覈心數據中處理大型基數
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與淺,所以我的主視圖e是開得)我用下面的代碼
predicateArrayClass.addPredicate(predicate: predicateType)
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "updateTableViewByNewPredicate"), object: nil, userInfo: nil)
self.dismiss(animated: true, completion: nil)
其中i稱爲更新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!)
}
你可以編輯你的問題來添加你創建讀取結果控制器的代碼嗎?如何配置它可能是一個關鍵細節。添加了 –
,並且還使用NSFetcherResultControllerDelegate方法更新tableView數據(controllerWillChangeContent,controllerDidChangeContent和didChangeObject)。我在「茶壺」的答案中添加了代碼,但加載時間仍然是幾秒鐘 – Skie