Tableview重新加载不准确

时间:2018-03-30 07:12:18

标签: ios user-interface refresh

我有一个控制器,允许用户输入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有关,但我从未真正了解它背后的机制,以及如何/在何处应用这些机制。

我希望你能告诉我

2 个答案:

答案 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中重载