在 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
类型。并使用closure
或delegation
来处理操作的结束
这正是我在回答的前半部分所做的。
@LucaD 我编辑了我的答案以删除危险代码并澄清前半部分。以上是关于在 Swift 中保存 http 请求的响应的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 如何在安装前将 json 文件保存在应用程序中
如何在 swift5 和 Alamofire 5 beta 版本中获取和保存响应?