我正在构建一个实现实时文本搜索的应用程序,只要文本输入发生变化,就会查询数据库。 当NSFetchedResultsController的fetchRequest返回超过一定数量的项目(> ~20)时,键盘输入有效。
func textViewDidChange(textView: UITextView) {
let predicate = NSPredicate("itemID" > 0) //<- returns all items
self.frc.fetchRequest.predicate = predicate
self.frc.executeFetchRequest(nil)
}
请注意,没有实际的UI更新,因此滞后键盘输入必须由fetchRequest引起。
有没有办法实现大量项目的实时搜索而没有这种滞后?
答案 0 :(得分:1)
问题是,您正在主线程上执行提取并使用您的请求加载所有对象。你真的需要加载所有物品吗?首先,将fetchBatchSize
设置为只有少量项目实际加载到内存中,当您在视图中滚动时,某些项目将自动加载而其他项目出现故障。如果这还不够,请考虑进行设计更改,您应该将实际提取移动到后台队列,并在结果出现时更新您的UI。这是一个很大的改变,因为如果用户必须取消先前正在进行的请求使搜索上下文无效(即他键入一个新字符)。