使用线程

时间:2015-06-28 07:44:14

标签: ios swift grand-central-dispatch sqlite.swift

我有一个希腊语词典应用程序,可以从Sqlite中搜索成千上万的单词条目来填充UITableView。我遇到了许多相同的问题here(键盘滞后,因为搜索文本发生了变化,并且需要中止搜索并在搜索文本发生变化时重新运行),并且提供的解决方案效果很好。

我的代码:

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替换搜索图标会有所帮助。

0 个答案:

没有答案