我知道这个问题听起来很奇怪,但我不知道另一种问题,首先,我正在玩Pokemon API,我是swift的新手。我的问题是什么我正在解析数据以显示口袋妖怪信息,但显示口袋妖怪的端点是这样的:
https://pokeapi.co/api/v2/pokemon/
{
"count": 949,
"previous": null,
"results": [
{
"url": "https://pokeapi.co/api/v2/pokemon/1/",
"name": "bulbasaur"
},
{
"url": "https://pokeapi.co/api/v2/pokemon/2/",
"name": "ivysaur"
},
{
"url": "https://pokeapi.co/api/v2/pokemon/3/",
"name": "venusaur"
},
使用名称和其他网址查看有关特定宠物小精灵的更多信息。我可以得到数组字典,我可以显示口袋妖怪名称,但我不知道如何获取另一个端点中的其他数据。
这是我现在的代码:
@IBAction func generatePokemon(_ sender: Any) {
// TODO: Improve API request
let apiUrl = URL(string: "https://pokeapi.co/api/v2/pokemon")
let request = URLRequest(url: apiUrl!)
// Request to Pokemon API
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
if error == nil {
// Optional binding to get data
if let data = data {
let parsedResult: [String:AnyObject]!
do {
parsedResult = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! [String:AnyObject]
if let resultDictonary = parsedResult["results"] as? [[String:AnyObject]] {
print(resultDictonary[0])
}
} catch {
print("Error in parse json")
}
}
}
}
task.resume()
}
所以我不确定是否需要创建另一个函数来获取该端点的数据,然后在我的generatePokemon函数中调用它,以便我可以用更多信息填充视图?或者消费这些数据的最佳方式是什么。
这也是我的回购,如果有人想看到它我在那里有一个分支,我正在做所有这第一个网络请求。
感谢你们的时间!
答案 0 :(得分:1)
嘿,我做了类似你需要的东西是我的回购:
https://bitbucket.org/pokemonred/pokedexgr2/
检查分支pokedexSebas,如果您有任何疑问,请告诉我。 我使用alamofire来执行请求。
在repo中你必须看看两个clases,第一个是:SBBackendManager和SebasObjectMapper。
在SBBackendManager中,我有以下两种方法:
func getAllPokemon () { // This will retrieve all pokemon
let url = "https://pokeapi.co/api/v2/pokemon"
Alamofire.request(url).responseObject { (response: DataResponse<SPokemonApiResponse>) in
let pokemonResponse = response.result.value
if let sPokeArray = pokemonResponse?.resultados {
contador = sPokeArray.count
}
}
}
func getPokemon(_ url:String){ // This will retrieve a single pokemon
Alamofire.request(url).responseObject { (response: DataResponse<SPokemon>) in
let spokemon = response.result.value
pokemonArray += [spokemon!]
contador = contador! - 1
}
}
在SebasObjectMapper上我有这个:
class SPokemonApiResponse:Mappable{
var resultados:[SPokemonResult]?
required init?(map: Map) { }
func mapping(map: Map) {
resultados <- map["results"]
}
}
class SPokemonResult:Mappable {
var url:String? {
didSet { // HERE: every time a result is added to the array will trigger the get a single pokemon method
let bm = SBackendManager()
bm.getPokemon(url!)
}
}
required init(map:Map) {}
func mapping(map: Map) {
url <- map["url"]
}
}