在我的某个应用中,用户可以按名称搜索位置。我正在使用Google Maps API在GMSPlacesClient
的帮助下显示自动完成的建议。
下面的代码说明了我是如何做到的:
func performSearch() {
let filter = GMSAutocompleteFilter()
filter.type = GMSPlacesAutocompleteTypeFilter.City
placesClient?.autocompleteQuery(searchBar.text!, bounds: nil, filter: filter, callback: { (results, error: NSError?) -> Void in
// update results
})
}
此代码非常有效。但是,我注意到一种情况,它有点失败。一个例子是我搜索“芝加哥”。如果我非常快地键入“Ch”,有时会正确返回“Ch”的结果,但有时我会得到“C”的结果。问题出现是因为这些是异步请求,每次用户输入内容时我都会执行搜索。因此,即使“C”的请求在“Ch”之前启动,它也可以最后返回。
因此,我需要在开始新请求之前取消之前发起的所有请求。但是,我找不到这样做的方法。有谁知道如何实现它?
我尝试过使用解决方法:
let string = myResults[0].attributedFullText
string.enumerateAttribute(kGMSAutocompleteMatchAttribute, inRange: NSMakeRange(0, string.length), options: .Reverse) { (value, range, stop) -> Void in
if value != nil {
let t = NSString(string: string.string)
let str = t.substringWithRange(range)
//now compare with original search string
}
}
这解决了芝加哥(以及其他类似案例)的问题。但是,这种方法会在用户输入拼写错误时禁用自动填充建议,因为匹配的字符串和原始搜索字符串在这种情况下总是不同。
所以,问题仍然存在。理想的方法是取消所有先前发起的请求。如果谷歌也存储了初始搜索字符串,那么类似于上面提到的方法可能会有效,但看起来请求后不会返回原始搜索字符串...
似乎唯一的选择是不使用SDK,而是使用Alamofire发送请求。然后可以轻松取消这些请求。但是,我不确定这有多好......