GMSPlacesClient取消请求

时间:2015-11-10 15:41:02

标签: ios swift asynchronous google-maps-api-3 google-places-api

在我的某个应用中,用户可以按名称搜索位置。我正在使用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发送请求。然后可以轻松取消这些请求。但是,我不确定这有多好......

0 个答案:

没有答案