arrays - 在 Swift 中过滤具有大量项目的数组
问题描述
我试图通过过滤一个包含 3000 多个项目的数组来实现在 tableview 中的搜索,并且正如预期的那样,结果是一个非常慢的搜索(在按下键几秒钟后,字母出现在搜索字段中)。关于如何使搜索更快的任何建议?
我尝试过使用filteredClips.filter { $0.text?.range(of: searchField.stringValue, options: [ .caseInsensitive, .anchored ]) != nil }
,但结果与下面的代码相同。
func controlTextDidChange(_ obj: Notification) {
let searchText = searchField.stringValue.lowercased()
let searchResults = filteredClips.filter {($0.text?.lowercased().contains(searchText))!
|| ($0.desc != nil &&
($0.desc?.lowercased().contains(searchField.stringValue.lowercased()))!)}
filteredClips = searchResults
clipsTableView.reloadData()
}
controlTextDidChange
注意:我认为上面提到的慢文本输入是由于每次都等待完成。是否可以在不等待controlTextDidChange
每个字符完成的情况下继续插入字符?
解决方案
You should use textfield delegate and try search by each character user entered by user.
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let text = (searchText.text! as NSString).replacingCharacters(in: range, with: string)
let count = text.count
if count > 1
{
searchList = searchText.text!.isEmpty ? searchList : searchList.filter({(searchListTitle: searchListDataModel) -> Bool in
// If dataItem matches the searchText, return true to include it
return searchListTitle.title?.range(of: searchText.text!, options: .caseInsensitive) != nil
})
tableView.reloadData()
return true
} else {
tableViewList = searchList
tableView.reloadData()
return true
}
}
推荐阅读
- android - 如果在应用程序被杀死或在后台收到新消息时发送通知的最佳方式
- assembly - 通过添加两个十六进制数字,需要找到标志 Z、N、V 和 C。我发现 Z、N、C 标志是正确的,但 V 应该是 0 而不是 1。为什么?
- linux - 在 chroot 环境中运行 yum groupupdate 时出现文件夹冲突
- java - 将 Java 字符串转换为 PostreSQL 字符变化(«mpaa_rating»)?
- java - 如何检查 ObservableArray 中是否已存在具有重复 LocalDateTime 属性的对象?
- c - 使用 OpenGL 渲染时的多线程对象加载
- c++ - 没有 srcs 的 Bazel cc_library 不能自行编译
- python - 重新启动应用程序中的线程,还是让服务器重新启动整个应用程序是更好的做法?
- java - 以下 Java/Android 语法实际上在做什么?
- python - 尝试 pip 安装时没有模块名称“_ctypes”