在数组字典中使用API​​端点 - Swift 4

时间:2018-03-02 13:49:49

标签: json nsdictionary swift4

我知道这个问题听起来很奇怪,但我不知道另一种问题,首先,我正在玩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函数中调用它,以便我可以用更多信息填充视图?或者消费这些数据的最佳方式是什么。

这也是我的回购,如果有人想看到它我在那里有一个分支,我正在做所有这第一个网络请求。

Github

感谢你们的时间!

1 个答案:

答案 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"]
    } 

}