我需要从坐标列表(P1,P2,... Pn)开始绘制一条路径。对于列表中的每一对 Pi,Pj,我调用方法 calculateDirectionsWithCompletionHandler
类(class) MKDirections
直到 Pn-1 元素。我第一次称它为一切看起来都很完美。
但是,如果我第二次或更多次打电话,我会收到此错误:
Error Domain=MKErrorDomain Code=3 "Directions Not Available" UserInfo={NSLocalizedFailureReason=Route information is not available at this moment., MKErrorGEOError=-4, MKDirectionsErrorCode=2, NSLocalizedDescription=Directions Not Available}
没有任何效果了。
我认为这是因为我在短时间内调用 API 的次数过多。我在网上发现我应该使用属性
direction.calculating
并检查请求是否已经在进行中。我无法理解如何使用它。任何人都可以帮助我吗?谢谢你。
最佳答案
我在进行单元测试时也遇到了同样的情况。
我通常对此类 API 所做的是使用速率限制器。它限制了在给定时间范围内对 API 的调用次数。
有几种实现,我成功使用并喜欢这个https://github.com/nuclearace/SwiftRateLimiter
它使您可以选择调用次数和时间范围。 (你甚至可以为一个 API 使用两个实例,比如说:每秒最多 10 次调用,每分钟最多 100 次调用)
我不太喜欢direction.isCalculating 方法,因为它使得在一般情况下很难同步你的线程。
一个简单的方法是在调用下一个电话之前等待应答。
得到答案后,directions.isCalculating
显然是假的。
但我更喜欢限速器。
苹果正在限制“写得不好/行为不端的应用程序”,但我不知道苹果记录了它用来这样做的速率限制。
代码示例:
let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 3, interval: 1.0)
GlobalDirectionsRateLimiter.removeTokens(1) {_,_ in
directions.calculate { (response: MKDirections.Response?, error: Swift.Error?) in
...
}
}
不要相信我的限速器参数。我的应用程序中的所有计算都来自用户操作,所以我不需要更多。
关于xcode - MKDirections 许多请求停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34400515/