如何解决当查询的数组很大并且需要时间来显示时,如何在搜索栏中显示entiere点击文本的结果?
我有一大组名为 baseOuChercheAliments 的 alimentobject。 我必须使用搜索栏在其中进行搜索。 当我这样做时,使用下面的代码,表格视图显示搜索第一个字母的结果,而不是所有的单词。 事实上,搜索第一个字母的列表需要时间,这是最后显示的内容,而不是搜索栏中完全点击的内容。
func searchBar(_ searchBar: UISearchBar,textDidChange searchText: String) {
DispatchQueue.global(qos: .default).async { [self] in
let searchTextBeingQuireid = searchText
var searchedRecords = [AlimentObject]()
let words = Set(searchText.split(separator: " ").map(String.init))
if searchText.isEmpty {
searchedRecords = [] //baseOuChercheAliments
} else {
var baseDeDonneesAlimentsFiltreeClassique = baseOuChercheAliments.filter{$0.nomAliment.range(of: searchText,options: .anchored) != nil}
baseDeDonneesAlimentsFiltreeClassique.sort(by: { $0.nomAliment < $1.nomAliment})
var baseDeDonneesAlimentsFiltreeComplexe = baseOuChercheAliments.filter { object in words.allSatisfy { word in object.nomAliment.localizedCaseInsensitiveContains(word) } }
baseDeDonneesAlimentsFiltreeComplexe.sort(by: { $0.nomAliment < $1.nomAliment })
var soustraction = Array(Set(baseDeDonneesAlimentsFiltreeComplexe).subtracting(baseDeDonneesAlimentsFiltreeClassique))
soustraction.sort(by: { $0.nomAliment > $1.nomAliment })
searchedRecords = baseDeDonneesAlimentsFiltreeClassique + soustraction
}
if searchText == searchTextBeingQuireid {
DispatchQueue.main.async {
baseDeDonneesAlimentsFiltree = searchedRecords
self.tableView.reloadData()
}
}
}
}
有人能告诉我如何解决这个问题,以便显示在搜索栏中完全点击的结果,而不仅仅是搜索栏中点击的第一个字母的搜索结果。
解决方法
阻止按值捕获函数参数,这就是为什么当您在过滤 searchText == searchTextBeingQuireid
结束时检查它总是为真。
相反,您需要将当前的 searchText
存储在您的类中,并在过滤时与它进行比较。
由于您需要尽快停止过时的过滤,因此您需要在每次长时间操作后检查 searchText
是否已更改。我在每个操作之间添加了检查,但它可能是多余的,您只能在需要时间的操作后留下检查(可以打印检查)
private var searchText = ""
func searchBar(_ searchBar: UISearchBar,textDidChange searchText: String) {
self.searchText = searchText
DispatchQueue.global(qos: .default).async { [self] in
var searchedRecords = [AlimentObject]()
let words = Set(searchText.split(separator: " ").map(String.init))
if searchText.isEmpty {
searchedRecords = [] //baseOuChercheAliments
} else {
var baseDeDonneesAlimentsFiltreeClassique = baseOuChercheAliments.filter{$0.nomAliment.range(of: searchText,options: .anchored) != nil}
if self.searchText != searchText {
return
}
baseDeDonneesAlimentsFiltreeClassique.sort(by: { $0.nomAliment < $1.nomAliment})
if self.searchText != searchText {
return
}
var baseDeDonneesAlimentsFiltreeComplexe = baseOuChercheAliments.filter { object in words.allSatisfy { word in object.nomAliment.localizedCaseInsensitiveContains(word) } }
if self.searchText != searchText {
return
}
baseDeDonneesAlimentsFiltreeComplexe.sort(by: { $0.nomAliment < $1.nomAliment })
if self.searchText != searchText {
return
}
var soustraction = Array(Set(baseDeDonneesAlimentsFiltreeComplexe).subtracting(baseDeDonneesAlimentsFiltreeClassique))
if self.searchText != searchText {
return
}
soustraction.sort(by: { $0.nomAliment > $1.nomAliment })
if self.searchText != searchText {
return
}
searchedRecords = baseDeDonneesAlimentsFiltreeClassique + soustraction
}
if self.searchText == searchText {
DispatchQueue.main.async {
baseDeDonneesAlimentsFiltree = searchedRecords
self.tableView.reloadData()
}
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。