【问题标题】:MKDirections many requests stop workingMKDirections 许多请求停止工作
【发布时间】:2015-12-21 16:45:32
【问题描述】:

我需要从坐标列表(P1,P2,... Pn)开始绘制一条路径。对于列表中的每一对 Pi,Pj,我调用类 MKDirections 的方法 calculateDirectionsWithCompletionHandler,直到 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 并检查请求是否已经在进行中。我无法理解如何使用它。任何人都可以帮助我吗?谢谢。

【问题讨论】:

  • 令人惊讶的是没有人谈论这个!

标签: xcode mapkit directions


【解决方案1】:

我在进行单元测试时也遇到了同样的情况。

我通常对此类 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
    ...
    }
}

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

【讨论】:

    猜你喜欢
    • 2013-03-20
    • 2018-01-08
    • 2013-02-26
    • 2022-08-06
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2013-10-04
    • 1970-01-01
    相关资源
    最近更新 更多