在Swift 3中实时搜索节流
我正在尝试使用Swift在我的PHP API上进行搜索。 到现在为止我已经完成了这件事。
var filteredData = [Products]() func getSearch(completed: @escaping DownloadComplete, searchString: String) { let parameters: Parameters = [ "action" : "search", "subaction" : "get", "product_name" : searchString, "limit" : "0,30" ] Alamofire.request(baseurl, method: .get, parameters: parameters).responseJSON { (responseData) -> Void in if((responseData.result.value) != nil) { let result = responseData.result if let dict = result.value as? Dictionary{ if let list = dict["products_in_category"] as? [Dictionary] { if self.filteredData.isEmpty == false { self.filteredData.removeAll() } for obj in list { let manPerfumes = Products(productDict: obj) self.filteredData.append(manPerfumes) } } } completed() } } } extension SearchViewController: UISearchResultsUpdating { func updateSearchResults(for searchController: UISearchController) { if (searchController.searchBar.text?.characters.count)! >= 3 { self.getSearch(completed: { self.searchResultTable.reloadData() self.searchResultTable.setContentOffset(CGPoint.zero, animated: true) }, searchString: searchController.searchBar.text!) } else { self.searchResultTable.reloadData() } } }
并且使用filteredData
更新表视图。 我如何限制搜索,以便在用户写入时说出来
"example" -> shows the results with example then he erase the "le" -> "examp" -> if the previous request is not completed, cancel it -> make request for "examp" and show the data in table view!
从我发现的另一个答案的PS
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { // to limit network activity, reload half a second after last key press. NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.reload), object: nil) self.perform(#selector(self.reload), with: nil, afterDelay: 0.5) } func reload() { print("Doing things") }
虽然如果我尝试用我的函数替换“self.reload”,我得到一个错误cannot convert value of type () to expected argument type selector
您的错误是因为您可能忘记了#selector()
部分。
以下是它的外观:
func searchBar() { NSObject.cancelPreviousPerformRequests(withTarget: self, selector: #selector(self.getSearch(completed:searchString:)), object: nil) perform(#selector(self.getSearch(completed:searchString:)), with: nil, afterDelay: 0.5) }
您收到错误,因为您没有将您的函数包含在#selector
现在,至于参数,这里有一个函数:
perform(#selector(getSearch:completion:searchString), with: , with: "search string")
将DispatchWorkItem与Swift 4一起使用!
// Add a searchTask property to your controller var searchTask: DispatchWorkItem? // then in your search bar update method // Cancel previous task if any self.searchTask?.cancel() // Replace previous task with a new one let task = DispatchWorkItem { [weak self] in self?.sendSearchRequest() } self.searchTask = task // Execute task in 0.75 seconds (if not cancelled !) DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.75, execute: task)
希望能帮助到你 !