我需要绘制一个以坐标列表(P1,P2,... Pn)开头的路径。对于我的列表中的每个下一对Pi,Pj,我调用类calculateDirectionsWithCompletionHandler
的方法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
并检查请求是否已在进行中。我无法理解如何使用它。有人可以帮帮我吗?谢谢。
答案 0 :(得分:0)
我在做单元测试时也遇到过同样的事情。
我通常使用此类API的方法是使用速率限制器。它限制了在给定时间范围内对API的调用次数。
我成功使用了几种实现方式,例如https://github.com/nuclearace/SwiftRateLimiter
它使您可以选择通话数量和时间范围。 (您甚至可以为一个API使用两个实例,这样说:每秒最多10个调用,每分钟最多100个调用)
我不太喜欢direction.isCalculating方法,因为对于一般情况,它使同步线程变得很困难。
一种简单的方法是等待下一个呼叫之前的答案。
得到答案后,directions.isCalculating
显然是错误的。
但是我更喜欢限速器。
Apple正在限制“写得不好/行为不当的应用程序”,但我不知道Apple记录了其用于这样做的速率限制。
代码示例:
let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 3, interval: 1.0)
GlobalDirectionsRateLimiter.removeTokens(1) {_,_ in
directions.calculate { (response: MKDirections.Response?, error: Swift.Error?) in
...
}
}
不相信我的限速器参数。我的应用程序中的所有计算均来自用户操作,因此我不需要更多。