And*_*huk 5 asynchronous google-maps-api-3 ios google-places-api swift
在我的某个应用中,用户可以按名称搜索位置.我正在使用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
        }
    }
这解决了芝加哥(以及其他类似案例)的问题.但是,当用户输入拼写错误时,此方法将禁用自动填充建议,因为匹配的字符串和原始搜索字符串在这种情况下总是不同.
所以,这个问题仍然存在.理想的方法是取消所有先前发起的请求.如果Google还存储了初始搜索字符串,则可以使用与上述类似的方法,但看起来请求后不会返回原始搜索字符串...
似乎唯一的选择是不使用SDK,而是使用Alamofire发送请求.然后可以轻松取消这些请求.但是,我不确定这有多好......
| 归档时间: | 
 | 
| 查看次数: | 507 次 | 
| 最近记录: |