解析请求到的内容,并用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

…待续

更多推荐