MKDirections许多请求停止工作

cic*_*o79 5 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}
Run Code Online (Sandbox Code Playgroud)

并且没有任何作品了.

我认为这是因为我在很短的时间内调用了API太多次了.我在网上发现我应该使用该属性direction.calculating并检查请求是否已在进行中.我无法理解如何使用它.有人可以帮帮我吗?谢谢.

Ger*_*tan 1

我在进行单元测试时也经历过同样的事情。

我通常对此类 API 执行的操作是使用速率限制器。它限制给定时间范围内对 API 的调用次数。

有几种实现,我成功使用并喜欢这个https://github.com/nuclearace/SwiftRateLimiter

它可以让您选择呼叫次数和时间范围。(您甚至可以为一个 API 使用两个实例,也就是说:每秒最多 10 次调用,每分钟最多 100 次调用)

我不太喜欢 Direction.isCalculate 方法,因为它使得在一般情况下同步线程变得困难。一个简单的方法是在拨打下一个电话之前等待答复。得到答案后,directions.isCalculating显然是假的。

但我更喜欢速率限制器。

苹果正在限制“编写不良/行为不当的应用程序”,但我不知道苹果是否记录了其用于这样做的速率限制。

代码示例:

let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 3, interval: 1.0)


GlobalDirectionsRateLimiter.removeTokens(1) {_,_ in
    directions.calculate { (response: MKDirections.Response?, error: Swift.Error?) in
    ...
    }
}
Run Code Online (Sandbox Code Playgroud)

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