【发布时间】:2017-07-15 14:53:09
【问题描述】:
我正在尝试使用 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<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。
我怎样才能限制搜索,所以让我们说用户何时写
"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!
附:从我找到的另一个答案
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
【问题讨论】:
-
如何将
self.reload函数替换为cancelPreviousPerformRequests选择器参数?你好像忘了把那个函数放在#selector? -
因为如果我尝试这样做,我会得到与您相同的错误:
NSObject.cancelPreviousPerformRequests(withTarget: self, selector: self.fetchFriends(user:completion:), object: nil)。注意到我没有将#selector添加到我的函数中吗? -
@rockyraccoon 还是同样的错误!
-
好吧,我试着复制你想要完成的事情,我没有收到任何错误:
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) } -
@rockyraccoon 好的,这没有错误!你在哪里对。虽然在执行,但如何将字符串传递给函数?
标签: ios swift swift3 uisearchbar alamofire