我正在搜索地址的应用中实施自动填充功能(每添加一个新字符进行一次搜索),并且我不断获得MKErrorDomain error 3
,即MKErrorLoadingThrottled
。根据{{3}},此错误发生在
未加载数据,因为数据限制有效。这个 如果应用程序频繁请求数据,则可能会发生错误 时间很短。
我确切地知道有多少请求正在进行,一个针对搜索查询中的每个新charachter(就像您希望自动完成工作一样)。当然,我是一个快速的人,但只有10或15个请求后能够达到极限似乎是荒谬的。看看以下两个来源参考,我不明白为什么我一直受到限制。
根据Apple dev:
每个应用或开发者ID都没有请求限制,所以写得很好 正确运行的应用程序应该没有任何问题。然而, 限制可能发生在一个写得不好的应用程序,创建一个极端 大量的请求。
和James Howard Apple dev
我要谈的另一件事是关于此的使用限制 API。 所以,我很高兴地宣布没有应用程序或开发人员 标识符广泛的使用限制 所以,如果你的应用程序拥有大量用户并且你想要做很多事情 请求,没关系。
它会起作用。
我们所拥有的节流实际上只是第一线 防范有缺陷的应用程序。 因此,如果您将路线请求或本地搜索请求放入 无限循环,你有一个bug,最终你会得到 节流。
但如果你做了一些合理的事情,你会说哦,我会去做 响应用户输入的方向,你知道你可以做一些 因为我们向他们展示了那个例子。
就像我们针对一个用户输入做了两个方向请求, 没关系。 但是,你知道如果你每次用户点击它时你都会做10,000次 屏幕,然后你会受到限制。 但是,只要保持合理,你就可以了。
为什么会发生这种情况的任何想法?
答案 0 :(得分:11)
自动完成需要特殊的API。 MapKit没有提供这样的界面。只需向普通搜索API发出数十个请求,就会产生巨大的负担。
您基本上有两个选择:
使用Google商家信息。他们有专门的Places Autocompletion API。在GitHub上甚至还有一个完整的iOS库。
减少请求数量,例如通过仅在用户暂停键入300ms并且仅在没有先前请求未完成时发送请求。但是,这仍然无法保证Apple不会限制您的请求。
答案 1 :(得分:4)
MKLocalSearch
主要用于在地图范围内查找兴趣点(商家等)。 CLGeocoder用于结构化地址和位置查找。
CLGeocoder documentation指定CLGeocoder请求 率限制,文档提供有关如何成为好公民的指导。
特别值得注意的是指南中的第一项:“最多发送一个用户操作请求”。这也应该适用于MKLocalSearch
- 如果您同时在飞行中有多个请求,那么您很可能会受到限制。
这实际上很容易实现:在发送新的MKLocalSearchRequest
之前,取消所有待处理的请求。这对于实现自动完成非常有意义,如您所描述的:如果用户输入第4个字符,您可能不需要第3个字符的请求或响应。
答案 2 :(得分:1)
在Time Profiler工具中运行您的应用程序,查看键入时对该方法的调用次数。
答案 3 :(得分:1)
我刚刚在 Swift 上写了帮助,以帮助建议使用Apple MapKit API。当用户停止输入请求时,它是呼叫搜索请求。 https://github.com/ArniDexian/GeocodeHelper
用法很简单:
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) {
GeocodeHelper.shared.decode(searchText.trimmed(), completion: { [weak self](places) -> () in
self?.dataSource.locations = places
self?.tableView.reloadData()
return
})
}