“路线”请求受到限制:尝试在 60 秒内快速发出 50 多个请求

问题描述 投票:0回答:1

我正在尝试实现这个 https://github.com/nuclearace/SwiftRateLimiter

这是我正在调用的代码

getDistanceBetweenLocations

_ = circleQuery?.observe(.keyEntered, with: {(key: String?, location: CLLocation?) in
            mapCoord[key!] = location?.coordinate //stores busID and it's coord in Dictionary
            self.getBusinessData(bus: key!)
            if (!searchBus.contains(key!)){
                searchBus.append(key!)
                
                self.getDistanceBetweenLocations(origLat: coordinates.lat, origLon: coordinates.lon, newLat: mapCoord[key!]!.latitude, newLon: mapCoord[key!]!.longitude, id: key!, done: {distance in
                    busDistance[key!] = distance
                    
                })
            }
        })

这是从上面的 GitHub 链接调用

ratelimiter
的代码:

let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 50, interval: .minute)
        
        GlobalDirectionsRateLimiter.removeTokens(directionsChecked) {d in
            print(d)
            directions.calculate { (response, error) in
                if let response = response, let route = response.routes.first {
                    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "BusDataChanged"), object: nil)
                    done(route.distance/1609)
                } else {
                    print("ERROR getting distance \(String(describing: error))")
                    //busDistance[id] = route.distance/1609
                }
            }
        }

这是removeTokens()

    public func removeTokens(_ count: Double, callback: @escaping (Double) -> ()) {
        
        if count > bucket.sizeOfBucket {
            callback(-Double.infinity)

            return
        }
        
        let now = Date().timeIntervalSince1970

        if now - intervalStart >= bucket.interval {
            intervalStart = now
            tokensThisInterval = 0
        }

        guard count <= bucket.tokensPerInterval - tokensThisInterval else {
            if firesImmediatly {
                return callback(-Double.infinity)
            }

            queue.asyncAfter(deadline: DispatchTime.now() + ceil(intervalStart + bucket.interval - now)) {
                func afterBucketRemove(tokensRemaining: Double) {
                    self.tokensThisInterval += count

                    callback(tokensRemaining)
                }

                self.bucket.removeTokens(count, callback: afterBucketRemove)
            }

            return
        }

        func afterBucketRemove(tokensRemaining: Double) {
            tokensThisInterval += count

            callback(tokensRemaining)
        }

        return bucket.removeTokens(count, callback: afterBucketRemove)
    }

据我了解,

GlobalDirectionsRateLimiter
tokensPerInterval
限制为1分钟间隔内的50个。我想我的第一个问题就在这一行:

GlobalDirectionsRateLimiter.removeTokens(directionsChecked)

在自述文件的示例中(directionsChecked)是一个硬数字。 我假设这应该是正在检查的文档的计数。因此,我的

directionsChecked
变量在每个循环中都会增加 1。我是不是错过了什么?

swift rate-limiting
1个回答
0
投票

看来我已经解决了这个问题。我定义了

let GlobalDirectionsRateLimiter = RateLimiter(tokensPerInterval: 50, 间隔: .分钟)

在每次循环时都重新定义的位置。所以我在顶部定义了一次,它似乎有效

© www.soinside.com 2019 - 2024. All rights reserved.