iOS-JSON数据的解析

2018-08-24  本文已影响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) {
        
    }
}
上一篇下一篇

猜你喜欢

热点阅读