在 Swift 中保存 http 请求的响应

Posted

技术标签:

【中文标题】在 Swift 中保存 http 请求的响应【英文标题】:Saving the response of a http request in Swift 【发布时间】: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 中。或者,也可以缓存该值以备后用。 【参考方案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 我编辑了我的答案以删除危险代码并澄清前半部分。

以上是关于在 Swift 中保存 http 请求的响应的主要内容,如果未能解决你的问题,请参考以下文章

自动发送请求并保存响应

Swift - 如何在安装前将 json 文件保存在应用程序中

如何在 swift5 和 Alamofire 5 beta 版本中获取和保存响应?

HTTP协议特点

如何保存响应 JSON 数组并在 swift 中使用用户默认值进行检索

HTTP协议的状态