首页 > 解决方案 > 在 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每个字符完成的情况下继续插入字符?

标签: arraysswiftsearchfilter

解决方案


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
        }
        
    }

推荐阅读