我有一个控制器,允许用户输入TextField。
每次用户键入字符时,该文本字段中的字符串将与字符串数组进行比较。如果匹配,则生成的数组将显示在uitableview中。
以下是代码:
func searchAutocompleteEntriesWithSubstring(substring:String){
let SUBSSTRING = substring.uppercased()
autocompleteStrings.removeAll()
for thisSchool in schoolArray{
if(thisSchool.name?.uppercased() .contains(SUBSSTRING))!{
autocompleteStrings.append(thisSchool)
}
}
autocompleteTableView.reloadData()
}
基本上,这很好用。的 BUT!
如果用户输入速度相当快,autocompleteTableView
会显示一行或多行(空行),而不是autocompleteStrings
数组中的字符串。
我尝试将上述代码封装在DispatchQueue.main.async {}
中,但这使得事情甚至更糟。
我想这与NeedsLayout或NeedsDisplay有关,但我从未真正了解它背后的机制,以及如何/在何处应用这些机制。
我希望你能告诉我
答案 0 :(得分:0)
试试此代码
func searchAutocompleteEntriesWithSubstring(substring: String) {
let filtered = schoolArray.filter() { ($0.name ?? "").uppercased().range(of: substring.uppercased()) != nil }
autocompleteStrings = filtered.map() { $0.name! }
autocompleteTableView.reloadData()
}
答案 1 :(得分:0)
也许你需要锁?
1.在异步队列中。
2.locklock。
3.匹配和数组追加
4.lock unlocks。
5.在mainqueue中重载