Многостраничный API замедляет загрузкуIOS

Программируем под IOS
Ответить
Anonymous
 Многостраничный API замедляет загрузку

Сообщение Anonymous »

Я использую этот БЕСПЛАТНЫЙ API NBA для технического тестирования. Загрузка команд прошла легко и просто. Проблема в том, что мне нужно было отобразить всех игроков конкретной команды. Команда не возвращает игроков, а только информацию о команде:
"data":[
0:{
"id":1
"abbreviation":"ATL"
"city":"Atlanta"
"conference":"East"
"division":"Southeast"
"full_name":"Atlanta Hawks"
"name":"Hawks"
}
1:{...}
2:{...}
]

Поэтому мне нужно получить всех игроков, которые возвращаются на нескольких страницах (примерно 35) с максимальным количеством 100 результатов. Я придумал этот код, который работает, но иногда это занимает больше времени, и я хотел бы попробовать что-нибудь еще.
func loadPlayers(team:Team, pages: Int?, completion: @escaping (_ error:Error?, _ players:[Player]) -> ()){
var players = [Player]()
let rest = RestManager()
for (key, value) in headers {
rest.requestHttpHeaders.add(value: value, forKey: key)
}
//loop thought the API pages this is o(n) but the API is really badly designed as teams doesen't have an array with the players
for page in 1..
rest.makeRequest(withEndPoint: "players?per_page=100&page=\(page)", withHttpMethod: .get) { (result) in
guard let response = result.response else {return}
if response.httpStatusCode == 200 {
guard let data = result.data else {return}
print(data.printJSON())
let decoder = JSONDecoder()
guard let playerResult = try? decoder.decode(PlayerData.self, from: data) else { return }
for player in playerResult.data {
DispatchQueue.main.async {
if player.team?.abbreviation == team.abbreviation {
players.append(player)
}
}
}
}else{
guard let error = result.error else {return}
completion(error, [])
}
completion(nil, players)
}
}
}

это моя модель данных:
struct PlayerData : Decodable {
var data:[Player]
var meta:MetaDataPlayer
}
struct Player : Decodable {
var id:Int?
var first_name:String?
var last_name:String?
var height_feet:Int?
var height_inches:Int?
var weight_pounds:Int?
var position:String?
var team:Team?
}

struct MetaDataPlayer : Decodable {
var total_pages:Int? // needed to loop through all pages of the API
var current_page:Int?
var next_page:Int?
var per_page:Int?
var total_count:Int?
}


Подробнее здесь: https://stackoverflow.com/questions/661 ... wn-loading
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»