Как установить глобальную переменную для указания времени между http-запросами? - PullRequest
0 голосов
/ 08 февраля 2019

Я использую 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")
}

Я бы хотел избегать использования как можно большего количества задач, во всяком случае, в любом случае, любое другое решение также будет высоко ценится.

1 Ответ

0 голосов
/ 09 февраля 2019

Нет, в iOS нет глобальной переменной, NSURLSessionConfiguration свойства или чего-либо еще, что реализует это - вам придется делать это самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...