在Swift中保存http请求的响应

时间:2016-02-16 15:20:22

标签: json swift http

我试图在Swift中创建一个http请求,获取一个JSON作为响应并保存它(从中获取所需的数据并以某种方式在屏幕上显示)

我正在提出这样的请求

func makeRequest(base: String, completionHandler: (JSON?, ErrorType?) -> Void){
    do {
        let opt = try HTTP.GET(baseUrl + "?base=" + base)
        opt.start { response in
            if let err = response.error {
                completionHandler(nil, err)
                return                }
            do {
                let json = try JSON(data: response.data)
                completionHandler(json, nil)
                return
            }
            catch {
                completionHandler(nil, nil)
                return
            }
        }
    } catch let error {
        completionHandler(nil, error)
    }
}

我打电话给" makeRequest"像这样的功能

func convert(value:Double, startCurrency:Currency, targetCurrency:Currency) -> (converted: Double, endCurrency: Currency) {

    let api = ApiManager()
    api.makeRequest(firstType, completionHandler: { (json:JSON?, error:ErrorType?) in
         // how to save the JSON in here?
    })

    //calculate the correct value using the data from the json and return it
    return (0.0, targetCurrency)
}

我是Swift的新手,我不确定如何存储变量" json"之后我从#34; api.makeRequest" ... 在"关闭"中我用它做的一切呆在那里(就像它应该)...... 如何将其存储为功能"转换"要归还吗?

我的做法完全错了吗?

2 个答案:

答案 0 :(得分:0)

一次结账https://github.com/SwiftyJSON/SwiftyJSON。第二,您想将数据存储在CoreData或某种形式的数据库中吗?如果没有,您可以立即将其发布到文本字段。

SwiftyJSON示例:

let json = JSON(data: dataFromNetworking)
  if let userName = json[0]["user"]["name"].string {
  //Now you got your value
  MytextLabel1.text = userName // set text field
}

答案 1 :(得分:0)

你的方法看起来很好,你只需要做最后一步。你有两个选择。最简单(和推荐)的方式如下:

func convert(value:Double, startCurrency:Currency, targetCurrency:Currency, cb: ((Double, Currency) -> Void) {
    let api = ApiManager()
    api.makeRequest(firstType, completionHandler: { (json:JSON?, error:ErrorType?) in
         // handle the error?
         // parse your JSON
         cb(amount, currency)
    })
}

要从 回调中获取数据,以下是一个示例。我假设您尝试在UILabel中展示数据,并且您正在从convert:子类调用UIViewController

// Your code
convert(12, /* whatever currency */) {
  (amount, currency) in
  displayLabel.text = "\(amount)"
}
// More of your code