Я использую http-запрос с сериализацией JSON в collectionViews, но интервал API ограничен.
"Мы применяем небольшое ограничение скорости. Наши текущие ограничения - 40 запросов каждые 10 секунд иограничено IP-адресом, а не ключом API. Вы можете подумать, что он может обрабатываться до 40 в одну секунду или в среднем 4 запроса в секунду. Таймер сбросит 10 секунд с вашего первого запроса в течение текущих 10 секунд "bucket ". Это означает, что если вы активируете ограничение, вам придется подождать до 9 секунд, прежде чем таймер будет сброшен, но в зависимости от того, где вы находитесь в пределах 10-секундного окна, это может быть уже в следующую секунду.
ВыВы можете использовать заголовки X-RateLimit, которые возвращаются при каждом запросе, чтобы отслеживать текущие ограничения. Если вы превысите ограничение, вы получите статус HTTP 429 с заголовком Retry-After. Как только истечет период охлаждения, выможете продолжать делать запросы. "
Источник: https://developers.themoviedb.org/3/getting-started/request-rate-limiting
Мне понравитсяЧтобы узнать, возможно ли установить глобальную переменную в приложении (_: 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")
}
Я бы хотел избегать использования как можно большего количества задач, во всяком случае, в любом случае, любое другое решение также будет высоко ценится.