MKDirections许多请求停止工作

时间:2015-12-21 16:45:32

标签: xcode mapkit directions

我需要绘制一个以坐标列表(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并检查请求是否已在进行中。我无法理解如何使用它。有人可以帮帮我吗?谢谢。

1 个答案:

答案 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
    ...
    }
}

不相信我的限速器参数。我的应用程序中的所有计算均来自用户操作,因此我不需要更多。