iOS应用从本地search获取限制

我正在一个应用程序search地址实现自动完成(每个新字符添加一个search),我不断得到MKErrorDomain error 3 ,这是MKErrorLoadingThrottled 。 根据苹果开发 ,这个错误发生在什么时候

数据未被加载,因为数据限制是有效的。 如果应用程序在短时间内频繁请求数据,则会发生此错误。

我确切知道有多less个请求正在进行,每个search查询中的每个新的字符(就像你期望的自动完成工作)。 当然,我是一个快节奏的打字员,但只要10或15个请求就能达到极限似乎是荒唐的。 看看以下两个源引用,我不明白为什么我不断收缩。

根据苹果dev :

每个应用程序或开发人员ID都没有请求限制,所以正确操作的编写良好的应用程序应该没有问题。 但是,在编写不佳的应用程序中可能会产生限制,这会造成极大数量的请求。

正如詹姆斯·霍华德在WWDC上所说:

另外我想谈的是这个API的使用限制。 所以,我很高兴地宣布,没有应用程序或开发人员标识符的广泛使用限制。 所以,如果你有一个有很多用户的应用程序,你想要做很多的请求,那就好了。

它会工作。

而我们所拥有的节stream,实际上只是针对有问题的应用程序的第一道防线。 所以,如果你把方向请求或者本地search请求放在一个无限循环中,你就会有一个bug,最终你会被限制。

但是如果你做了一些合理的事情,你会说哦,我只是为了回应用户的input而做出一些指示,而且你知道可以做一些这样的事情,因为我们向他们展示了这个例子。

就像我们做了两个方向请求,以响应一个用户input,没关系。 但是,你知道,如果你每次用户点击屏幕上的10000次,那么你将会受到限制。 但是,保持合理,你会没事的。

任何想法,为什么这是发生?

自动完成需要特殊的API。 MapKit不提供这样的接口。 仅仅向正常的searchAPI发出数十个请求会导致巨大的负载。

你基本上有两个select:

  1. 去Google地方。 他们有一个专门的地方Autocompletion API 。 在GitHub上甚至还有一个完整的iOS库。

  2. 减less请求的数量,例如,如果用户已经暂停input了300毫秒,并且只有在没有更早的请求未完成的情况下才发送一个请求。 但是这仍然不能保证苹果不会抑制你的要求。

MKLocalSearch主要用于查找地图范围内的兴趣点(商业等)。 CLGeocoder用于结构化的地址和位置查找。

CLGeocoder文档指定CLGeocoder请求速率是有限的,文档提供了如何成为一个好公民的指导。

特别值得注意的是指南中的第一项:“最多发送一个用户请求”。 这也应该适用于MKLocalSearch – 如果在同一时间有多个请求在飞行中,您很可能会受到限制。

这实际上很容易实现:在发送新的MKLocalSearchRequest之前,取消所有未决的请求。 这对于像你所描述的那样实现自动完成有很大的意义:如果用户input第四个字符,那么你可能不需要第三个字符的请求或响应。

在“时间分析器”工具中运行您的应用程序,查看键入时正在调用的方法数量。

我只是在Swift上写了Helper来帮助build立Apple MapKit API。 当用户停止input请求时,它是呼叫search请求。 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 }) }