我正在尝试通过Swift在我的PHP API上进行实时搜索。到目前为止,我已经完成了此事情。
I'm trying to live search at my PHP API with Swift. Until now i've done this thing.
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<String, AnyObject>{ if let list = dict["products_in_category"] as? [Dictionary<String, AnyObject>] { 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 。 我该如何限制搜索,所以可以说用户输入内容时
And the table view is being updated with the filteredData. How can i throttle the search so lets say when the user writes
"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!P.S。从另一个答案中找到了我
P.S. from another answer i found
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,则会出现错误 无法将类型()的值转换为预期的参数类型选择器
Although if I try to replace "self.reload" with my function, I get an error cannot convert value of type () to expected argument type selector
推荐答案您的错误是因为您可能忘记了 #selector() 部分。
Your error was because you probably forgot the #selector() part.
这是它的外观:
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
You get the error because you didn't enclose your function in #selector
现在,关于参数,这是一个函数:
Now, as for the arguments, here's a function for that:
perform(#selector(getSearch:completion:searchString), with: <some completion>, with: "search string")更多推荐
Swift 3中的实时搜索限制
发布评论