【发布时间】:2021-05-13 06:52:04
【问题描述】:
我正在使用这个FREE NBA API 进行技术测试。加载团队既简单又简单。问题是我必须显示特定球队的所有球员。球队不返回球员,只返回球队信息:
"data":[
0:{
"id":1
"abbreviation":"ATL"
"city":"Atlanta"
"conference":"East"
"division":"Southeast"
"full_name":"Atlanta Hawks"
"name":"Hawks"
}
1:{...}
2:{...}
]
所以我必须获取在最多 100 个结果的几页(大约 35 个)中返回的所有玩家。我想出了这个有效的代码,但有时需要更长的时间,我想尝试其他的。
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..<pages! {
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?
}
【问题讨论】: