[英]Filtering an array with large number of Items in 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
完成每个字符的情况下继续插入字符?
您应该使用文本字段委托并尝试按用户输入的每个字符用户进行搜索。
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.