【问题标题】:Saving the response of a http request in Swift在 Swift 中保存 http 请求的响应
【发布时间】:2016-02-16 15:20:21
【问题描述】:

我正在尝试在 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 的新手,从“api.makeRequest”获取变量“json”后,我不确定如何存储它... 我在“关闭”中对它所做的一切都留在那里(就像它应该的那样)...... 如何存储它以供“转换”函数返回?

我的方法完全错误吗?

【问题讨论】:

  • 如果您想简单地处理您的值,您可以编写一个新函数,从您的完成处理程序中获取您的 json 对象。否则,您可以从您的 json 创建一个对象字典并将其存储在 NSUserDefaults 或 CoreData 中。或者,也可以缓存该值以备后用。

标签: json swift http


【解决方案1】:

签出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
}

【讨论】:

    【解决方案2】:

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

    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)
        })
    }
    

    为了从 that 回调中获取数据,这里有一个例子。我假设您正在尝试在 UILabel 中呈现数据,并且您正在从您的 UIViewController 子类调用 convert:

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

    【讨论】:

    • 为什么说是同步的呢? HTTP (SwiftHTTP) 是一个异步库。无论如何,您保持主线程阻塞的方法是错误的。 iOS 可以杀死在主线程中冻结时间过长的应用程序。
    • @LucaD HTTP 回调不是同步的,但对convert 的调用是同步的。如果该调用保持同步是绝对重要,我给出了一个解决方案。但是,我完全知道这是非常危险的,这就是我添加警告的原因。
    • 这里的正确方法是为convert函数使用void类型。并使用closuredelegation 来处理操作的结束
    • 这正是我在回答的前半部分所做的。
    • @LucaD 我编辑了我的答案以删除危险代码并澄清前半部分。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 2021-08-28
    • 2020-11-17
    相关资源
    最近更新 更多