我在collectionViews中使用带有JSON序列化的http请求,但API间隔是有限的。
“我们确实执行了少量的速率限制。我们当前的限制是每 10 秒 40 个请求,并且受 IP 地址限制,而不是 API key 。您可以认为这是在一秒钟内突发到 40 个请求,或者平均每秒 4 个请求。计时器将从当前 10 秒“桶”内的第一个请求开始重置 10 秒。这意味着,如果您触发限制,则在计时器重置之前最多需要等待 9 秒,但是根据您在 10 秒窗口内所处的位置,也可能是下一秒。
您可以使用每个请求返回的 X-RateLimit header 来跟踪当前限制。如果超出限制,您将收到带有 Retry-After header 的 429 HTTP 状态。一旦您的冷静期到期,您就可以继续提出请求。”
来源:https://developers.themoviedb.org/3/getting-started/request-rate-limiting
我想知道是否可以在 application(_:didFinishLaunchingWithOptions:) 上设置一个全局变量,该变量会自动增加发出的所有 http 请求之间的时间,我需要避免触发 10 秒等待定时器。
private func requestJSON(for dataItem: Movie) -> UIImage? {
let query = dataItem.title!.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed)
let requestURL = URL(string: "https://api.themoviedb.org/3/search/movie?api_key=25149a6f75e14fb0672911327a13939a&language=en-US&query=\(query!)&page=1&include_adult=false&year=\(dataItem.primary_release_year!)")!
if let data = try? Data(contentsOf: requestURL) {
if let JSON = try? JSONSerialization.jsonObject(with: data, options: .allowFragments) as? [String: Any] {
if let x = JSON?["results"] as? [Dictionary<String, Any>], let y = x.first {
if let pp = y["poster_path"] as? String {
dataItem.poster = try? Data(contentsOf: URL(string: defaultBaseURL + pp)!)
print("Downloading... \(dataItem.title!)'s poster.")
}
}
}
}
return dataItem.poster?.first != nil ? UIImage(data: dataItem.poster!) : UIImage(named: "default-movie")
}
我希望尽可能避免使用大量任务,无论如何,任何其他解决方案也将非常感激。
最佳答案
不,没有全局变量、NSURLSessionConfiguration
属性或 iOS 中内置的任何内容来实现此功能 - 您必须自己执行此操作。
关于ios - 如何设置全局变量来指定http请求之间的时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54599901/