我有一个希腊语词典应用程序,它从 Sqlite 搜索数万个单词条目以填充 UITableView。我遇到了这里列出的许多相同的问题(搜索文本更改时键盘滞后,如果搜索文本更改,则需要中止搜索并重新运行),并且提供的解决方案效果很好。
我的代码:
func updateSearchResultsForSearchController(searchController: UISearchController) {
if (self.resultSearchController.searchBar.text == "") {
theResultsArray.removeAll(keepCapacity: true)
searchTable.reloadData()
return
}
self.theResultsArray = filter(self.wordArray) {
$0[self.betaNoSymbols].rangeOfString(self.resultSearchController.searchBar.text) != nil
// ($0[self.betaCode] as NSString).containsString(self.resultSearchController.searchBar.text)
}
searchTable.reloadData()
}
在当前示例中,我只搜索一个字段,但我想搜索多个字段,带有和不带变音符号的希腊词,以及带有和不带符号的 beta 代码(音译英语)。我想知道查询 Sqlite 或首先将单词列表放在一个数组中是否会更快,以及是否有另一个使用 Swift 和 iOS 8 的解决方案。如果我应该修改代码,将不胜感激。
更新:
我已将搜索放在异步队列中,它似乎正在工作。使用数组过滤器,在对 UISearchBar 进行大量编辑后,搜索由于某种原因停止工作,因此现在使用 Sqlite。
let searchQueue = dispatch_queue_create("searchQueue", DISPATCH_QUEUE_SERIAL)
func updateSearchResultsForSearchController(searchController: UISearchController) {
if (self.resultSearchController.searchBar.text == "") {
theResultsArray.removeAll(keepCapacity: true)
searchTable.reloadData()
println("Search field empty.")
return
}
let searchText = self.resultSearchController.searchBar.text
var tempArray = [Row]()
dispatch_async(searchQueue) {
// abort if text changed
if searchText != self.resultSearchController.searchBar.text {
println("Search changed, aborted.")
return
}
// do search
if resultSearchController.searchBar.selectedScopeButtonIndex == 0 {
tempArray = Array(self.liddellQuery.select(self._id, self.greekFullWord).filter(
like("%\(self.resultSearchController.searchBar.text!)%", self.betaNoSymbols)
|| like("%\(self.resultSearchController.searchBar.text!)%", self.betaSymbols)
|| like("%\(self.resultSearchController.searchBar.text!)%", self.greekFullWord)
|| like("%\(self.resultSearchController.searchBar.text!)%", self.greekLowercase)
|| like("%\(self.resultSearchController.searchBar.text!)%", self.greekNoSymbols) println("Searched: \(self.resultSearchController.searchBar.text), results: \(tempArray.count)")
} else {
...
}
// update if search still current
if searchText == self.resultSearchController.searchBar.text {
dispatch_async(dispatch_get_main_queue()) {
self.theResultsArray = tempArray
self.searchTable.reloadData()
}
}
}
}
我不确定是否是最好的方法。搜索之间也有很长的延迟,用 UIIndicatorView 替换搜索图标会很有帮助。