美文网首页
iOS-JSON数据的解析

iOS-JSON数据的解析

作者: 长衣貌 | 来源:发表于2018-08-24 12:06 被阅读0次

    首先是创建桥接文件
    简单的方式就是在Swift工程中创建OC文件.系统会提示你创建桥接文件的
    倒入第三方AFNetworking文件
    在桥接文件中倒入头文件 #import "AFNetworking.h"
    然后对AFNetworking的简单封装

    //import AFNetworking
    
    /** 请求类型枚举 */
    enum RequestType : String {
        case GET = "GET"
        case POST = "POST"
    }
    
    // MARK:- 创建网络请求工具类的单例对象
    class PDNetworkTools: AFHTTPSessionManager {
        /** let本身就时线程安全的.在多个线程中能保证只创建一次 */
        static let sharedInstance : PDNetworkTools = {
            let instence = PDNetworkTools()
            /** 设置数据内容样式(在集合内插入新的数据格式) */
            instence.responseSerializer.acceptableContentTypes?.insert("text/html")
            instence.responseSerializer.acceptableContentTypes?.insert("text/plain")
            return instence
        }()
    }
    
    // MARK:- 封装GET和POST请求
    extension PDNetworkTools {
        /** 参数名称
         参数progress./下载进度
         参数task./任务对象
         参数request./请求得到数据
         参数error./如果下载失败的错误信息 */
        /** 封装的请求方法,外界调用通过闭包得到结果 */
        func request(_ requestType : RequestType, urlString : String, parameters : [String : Any], finished : @escaping (Any?, Error?) -> ()) {
            /** 下载进度progressCallBack */
            let progressCallBack : ((Progress) -> Void)? = { (progress) in
                /** 下载进度 */
            }
            /** 成功successCallBack */
            let successCallBack : ((URLSessionDataTask, Any?) -> Void)? = { (task, request)  in
                /** 下载成功 */
                finished(request, nil)
            }
            /** 失败failureCallBack */
            let  failureCallBack : ((URLSessionDataTask?, Error) -> Void)? = { (task, error) in
                /** 请求失败 */
                finished(nil, error)
            }
            
            /** 判断请求类型 */
            if requestType == .GET {
                /** 发送GET请求 */
                get(urlString, parameters: parameters, progress: progressCallBack, success: successCallBack, failure: failureCallBack)
            } else {
                /** 发送POST请求 */
                post(urlString, parameters: parameters, progress: progressCallBack, success: successCallBack, failure: failureCallBack)
            }
        }
    }
    

    接下来就是在需要请求数据的地方调用封装好的请求方法
    参数
    1./请求的方式, GET 或者 POST (枚举类型直接用点语法就可以)
    2./网址字符串
    3./请求的参数
    4./请求结束回调, (闭包内的参数 1./ 请求到的数据 2./错误信息)

    PDNetworkTools.sharedInstance.request(<#T##requestType: RequestType##RequestType#>, urlString: <#T##String#>, parameters: <#T##[String : Any]#>, finished: <#T##(Any?, Error?) -> ()#>)
    

    下面是请求的示例

          //网址字符串
          let urlString = "http://api.jisuapi.com/news/get"
            
            //请求的参数
            let par : [String : Any] = [
                "channel" : "头条",
                "start" : 0,
                "num" : 10,
                "appkey" : "de394933e1a3e2db"
                ]
            
          //调用封装好的请求方法
            PDNetworkTools.sharedInstance.request(.GET, urlString: urlString, parameters: par) { (result, error) in
                //错误校验
                guard error == nil else {
                    return
                }
                guard let jsonDict = result else {
                    return
                }
                //拆分数据
                let dict = jsonDict as! NSDictionary
                let resultDict = dict.value(forKey: "result") as! NSDictionary
                let listArray = resultDict.value(forKey: "list") as! NSArray
                
                for item in  listArray{
                    //通过数据模型的构造方法快速字典转模型
                    let model = Model(dict: item as! [String : Any])
                    self.dataSource.append(model)
                    
                }
                //刷新表格展示数据
                self.mainTableView.reloadData()
            }
    

    数据模型

    import UIKit
    
    class Model: NSObject {
    
        @objc var title : String?
        @objc var content : String?
        
        init(dict : [String : Any]) {
            super.init()
            setValuesForKeys(dict)
        }
        override func setValue(_ value: Any?, forUndefinedKey key: String) {
            
        }
    }
    

    相关文章

      网友评论

          本文标题:iOS-JSON数据的解析

          本文链接:https://www.haomeiwen.com/subject/miebiftx.html