TLDR:
Вы можете попробовать использовать рекурсивную функцию, которая выполняется, когда в ответе http (json) существует смещение.
Подтверждение:
Это решение заняло 7 часов исследований, поиска неисправностей и советов от великого и влиятельного Дуга. Проект использует Alamofire для выполнения http-запросов и SwiftyJson для доступа к JSON.
Причина:
В документации Airtable указывается, что их лимит скорости составляет 100 единиц на запрос. Если запрос содержит более 100 элементов, запрос будет включать смещение.
Они дают указание включить смещение в ваш следующий запрос, чтобы получить следующие 100 результатов. Но они не объясняют и не демонстрируют, как это сделать.
Решение:
Он был протестирован на получение 2565 элементов из 25 HTTP-запросов. Написанная на Swift, логика проста:
Напишите рекурсивную функцию с аргументом для необязательного смещения. Вызовите функцию без смещения. Проверьте HTTP-ответ (JSON) для смещения. Если смещение существует, сохраните http-запрос (json) в массиве вне функции. Затем вызовите эту же функцию изнутри себя - на этот раз со смещением.
Расширенный код здесь.
func requestAirtableRecords(forTable table: String, withTableView tableView: String, withOffset offset: String?, completion: @escaping ([JSON]) -> ()) {
let parameters: [String: Any] = offset != nil ? ["view": tableView, "offset": offset!] : ["view": tableView]
do {
let url: URLRequest = try self.requestRecordsURL(table: table, method: HttpRequest.get, parameters: parameters)!
Alamofire.request(url).responseJSON { (response) in
switch response.result {
case .success(_):
let json = JSON(response.result.value!)
self.jsonArray.append(json)
let nextOffset = json["offset"]
if nextOffset.exists() {
self.requestAirtableRecords(forTable: table, withTableView: tableView, withOffset: nextOffset.stringValue, completion: { _ in
completion(self.jsonArray)
})
} else {
completion(self.jsonArray)
}
case .failure(let error):
print(error)
}
}
} catch {
print("Error: Unable to request records from Airtable.")
}
}