等待多个Alamofire请求

时间:2016-02-08 11:53:37

标签: ios json swift alamofire

我试图将数据添加到我的数据模型中以便测试它我打印通过Alamofire获取的信息但我的问题是因为一些数据需要再次调用api,当我打印时它变为null它。这是我的代码

获取此人数据的代码

func printAPI(){

swApiHandler.requestSWPApi("http://swapi.co/api/people", completionHandler: {(response, error) in

    let json = JSON(response!)
    let jsonResult = json["results"]

    for (index,person):(String, JSON) in jsonResult{
        let name = person["name"].stringValue
        let height = person["height"].intValue
        let mass = person["mass"].intValue
        let hairColor = person["hair_color"].stringValue
        let skinColor = person["skin_color"].stringValue
        let eyeColor = person["eye_color"].stringValue
        let birthYear = person["birth_year"].stringValue
        let gender = person["gender"].stringValue
        let homeWorldUrl = person["homeworld"].stringValue
        let homeWorldNameKey = "name"
        let homeWorld = self.getSWApiSpecificValue(homeWorldUrl, strKey: homeWorldNameKey)

        print("Name: \(name)")
        print("Height: \(height)")
        print("Mass: \(mass)")
        print("Hair Color: \(hairColor)")
        print("Skin Color: \(skinColor)")
        print("Eye Color: \(eyeColor)")
        print("Birth Year: \(birthYear)")
        print("Gender: \(gender)")
        print("Home World: \(homeWorld)")
        print("------------------------------")
    }
})

}

获取特定值的代码

  func getSWApiSpecificValue(strUrl: String, strKey: String) -> String{
    var name = ""
    swApiHandler.requestSWPApi(strUrl, completionHandler: {(response,error) in
        let json = JSON(response!)
        print(json[strKey].stringValue)
        name = json[strKey].stringValue
    })

    return name
}

如果您想知道JSON模型,那么

JSON Model

在这里运行代码的输出 Output

1 个答案:

答案 0 :(得分:1)

您应该在后台进行api调用,并在完成后在主队列中填充数据。 只需更改代码即可获得此特定值:

func getSWApiSpecificValue(strUrl: String, strKey: String) -> String{
  var name = ""
  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)) { () -> Void in
swApiHandler.requestSWPApi(strUrl, completionHandler: {(response,error) in
    dispatch_async(dispatch_get_main_queue()) {
      let json = JSON(response!)
      print(json[strKey].stringValue)
      name = json[strKey].stringValue
      return name
    }
  })
 }
}

在上面的代码中,您首先在background向服务器发出请求,如果您在main队列中得到响应,则会填充variable name。 将api调用函数改为类似的更好:

func getDataFromServer(ulr: String, success: (([AnyObject]) -> Void)?, failure: (error: ErrorType) -> Void){
}

通过这种方式,您可以处理错误,并在成功获取数据时使用。