# Swift学习笔记32-网络请求(2)
解析请求到的内容,并用Model存放
在函数getDetailRequest中的postRequest里执行具体网络请求的时候,执行完毕返回的是dic,
解析一下请求到的是什么,再决定Model里需要存储什么键名,根据键名去匹配键值。
如果有值,postRequest函数会走到这里,返回的是一个字典。
if let dataDic = dic?[dataKey] {
completion(dataDic)
return
func getDetailRequest() {
let dic = ["sys_lan": "1", "result_str": "INFJ"]
let jsonStr = dicValueString(dic as[ String : Any])
// print(jsonStr)
postRequest(jsonStr: jsonStr, url: RequestDetailReport.DetailBaseUrl) { dic in
print (dic)
}
打印一下发现是像这样的,根据要用的键创建一个ReportModel,把这些变量都加进去。
nick = “字符串”;
pairing = “字符串”;
“result_str” = INFJ;
“sys_lan” = 1;
struct ReportModel {
var advantage: String
var career: String
var celebritys: String
var disadvantage: String
var id: Int
var nick: String
var result_str: String
var pairing: String
}
需要用的变量就是这些。
从dic里获取到的是键值对,可以通过键来获取对应的值,再传入Model中。
现在需要按照键key来找dic中的值,找到了之后再把它转换为对应的格式,然后传入Model中。
用一个函数base来执行该操作,为了可以无(结构体的)实例使用,使用static修饰
在字典中取值的方式是这样的:
let advantage = dic["advantage"]
然后把它转换为需要的数据类型(比如这里是String)
let advantage = dic[”advantage”] as String
但是有可能取不到值,所以要安全转换as?后面要加??
let advantage = dic[”advantage”] as? String ?? ""
以此类推获取其他部分的元素, 最后再把它们添加到Model内
static func base(with dic:[String: Any]) -> ReportModel {
let advantage = dic["advantage"] as? String ?? ""
let career = dic["career"] as? String ?? ""
let celebritys = dic["celebritys"] as? String ?? ""
let disadvantage = dic["disadvantage"] as? String ?? ""
let id = dic["id"] as? Int ?? 0
let nick = dic["nick"] as? String ?? ""
let result_str = dic["result_str"] as? String ?? ""
let pairing = dic["pairing"] as? String ?? ""
return ReportModel(advantage: advantage, career: career, celebritys: celebritys, disadvantage: disadvantage, id: id, nick: nick, result_str: result_str, pairing: pairing)
}
Model内的添加函数写好了,接下来我们要回到RequestDetail Report里调用这个函数,把获取到的数据传进去,虽然我们知道闭包返回的dic是一个字典数组,但我们还是先将其转为字典数组形式,如果转换成功,再调用函数。
if let arr = dic as? [Dictionary<String, Any>] { }
Dictionary<String, Any>:
- 这是Swift中字典的标准语法,表示一个键为
String类型,值为Any类型的字典
因为用了as?, 意味着如果是空的,也可以转成功。但是也有可能从网络上获取不到数据,为了防止获取不到值,用一个if else来避免这张情况。
postRequest(jsonStr: jsonStr, url: RequestDetailReport.DetailBaseUrl) { dic in
if let arr = dic as? [Dictionary<String, Any>] {
if arr.count == 0 {
} else {
}
}
由于我们需要使用函数调用之后的结果(???嗯,这个是我猜的),所以定义一个回调来接收结果。因为调用函数的时候用到了ReportModel,所以在回调里也必须把Model传进来,也就是var responseBlock: ((ReportModel?) → ())? 为了防止值不存在的情况,加上?可选链
既然要使用回调,一定要使用弱引用[weak self],防止内存泄漏。在字典数组里没值的时候就设置为nil, 字典有值的时候调用函数base将值传进model,再将传之后的结果赋值给model。
let jsonStr = dicValueString(dic as[ String : Any])
// print(jsonStr)
postRequest(jsonStr: jsonStr, url: RequestDetailReport.DetailBaseUrl) { [weak self] dic in
if let arr = dic as? [Dictionary<String, Any>] {
if arr.count == 0 {
self?.responseBlock?(nil)
} else {
let model = ReportModel.base(with: arr[0])
print(model)
}
} else {
}
}
}
最后将model打印下来,发现从服务器请求到的数据已经被成功添加到Model
…待续
更多推荐


所有评论(0)