示例_Http請求數(shù)據(jù)

    1. 協(xié)議類: YeProtocolForHttpData.swift
//
//  YeProtocolForHttpData.swift
//  TyeProject
//
//  Created by Tye on 20../../..
//

import Foundation

///== 1. 數(shù)據(jù)實體的基礎(chǔ)協(xié)議: 所有數(shù)據(jù)實體都須遵循它;
protocol YeProtocolForDataEntity
{
    //【靜態(tài)方法】將二進制Data數(shù)據(jù) (編碼)轉(zhuǎn)換為 本身實例對象 的方法:
    static func yeDataToSelf(eData:Data) -> Self?
}





///== 2. 網(wǎng)絡(luò)請求的基礎(chǔ)協(xié)議: 所有的網(wǎng)絡(luò)請求都須遵循它;
protocol YeProtocolForHttp {
    var eStrUrl: String {get} // 請求地址;
    var eEnumType: YeHttpRequestTypeEnum { get } //請求方式;
    var eDicParameter: [String: Any] { get } // 請求傳遞的參數(shù);
    
    // 泛型: 服務(wù)器返回的數(shù)據(jù)實體,(遵循數(shù)據(jù)實體協(xié)議的泛型,因為不同的Url返回不同的實體)
    associatedtype eDataEntity: YeProtocolForDataEntity
}

///-- 擴展一個屬性:  ( 默認實現(xiàn): )
extension YeProtocolForHttp{
    var eHost : String {return "https://www.baidu.com/"} // TODO: Url主地址;
}

// 請求方式: 共有9種, 常見的4種:
enum YeHttpRequestTypeEnum:String{
    case GET
    case POST
    case PUT
    case DELETE
}

    1. 網(wǎng)絡(luò)請求類: YeHttpRequest.swift
//
//  YeHttpRequest.swift
//  TyeProject
//
//  Created by Tye on 20../../..
//

import Foundation

protocol YeProtocoToHttpRequest{
    // 定義為泛型,這樣可以接收所有的網(wǎng)絡(luò)請求:
    func yeSend<T:YeProtocolForHttp>(_ eRequest: T, eHandler: @escaping (T.eDataEntity?) -> Void)
}

// 執(zhí)行網(wǎng)絡(luò)請求:
struct YeHttpRequest: YeProtocoToHttpRequest{
    func yeSend<T>(_ eRequest: T, eHandler: @escaping (T.eDataEntity?) -> Void) where T : YeProtocolForHttp {
        let eStrUrl = eRequest.eHost.appending(eRequest.eStrUrl) //拼接處出完整的請求地址;
        
        var eURLRequest = URLRequest(url: URL(string: eStrUrl)!)
        eURLRequest.httpMethod = eRequest.eEnumType.rawValue
        
        let eDataTask = URLSession.shared.dataTask(with: eURLRequest) { eData, eURLResponse, eError in
            // eData: 從服務(wù)器獲得的數(shù)據(jù) 二進制Data類型; 將其解析為數(shù)據(jù)實體(協(xié)議的方法):
            guard let eD = eData, let eEntity = T.eDataEntity.yeDataToSelf(eData: eD) else { return }
            
            DispatchQueue.main.async { // 回到主線程;
                eHandler(eEntity)
            }
        }
        eDataTask.resume() //開始任務(wù);
    }
    
    
    //--- or 靜態(tài)方法:
    static func yeSendStatic<T>(_ eRequest: T, eHandler: @escaping (T.eDataEntity?) -> Void) where T : YeProtocolForHttp {
        let eStrUrl = eRequest.eHost.appending(eRequest.eStrUrl) //拼接處出完整的請求地址;
        
        var eURLRequest = URLRequest(url: URL(string: eStrUrl)!)
        eURLRequest.httpMethod = eRequest.eEnumType.rawValue
        
        let eDataTask = URLSession.shared.dataTask(with: eURLRequest) { eData, eURLResponse, eError in
            // eData: 從服務(wù)器獲得的數(shù)據(jù) 二進制Data類型; 將其解析為數(shù)據(jù)實體(協(xié)議的方法):
            guard let eD = eData, let eEntity = T.eDataEntity.yeDataToSelf(eData: eD) else { return }
            
            DispatchQueue.main.async { // 回到主線程;
                eHandler(eEntity)
            }
        }
        eDataTask.resume() //開始任務(wù);
    }
}

///== 使用示例: eg

  1. 數(shù)據(jù)實體類: YeDataEntityToEg.swift
//
//  YeDataEntityToEg.swift
//  TyeProject
//
//  Created by Tye on 20../../..
//

import Foundation

//--- 為數(shù)據(jù)實體類擴展協(xié)議, 以使其遵循此協(xié)議:
extension YeDataEntityToEg: YeProtocolForDataEntity{
    // 實現(xiàn)協(xié)議方法:(初始化)
    static func yeDataToSelf(eData: Data) -> Self? {
        return YeDataEntityToEg(eData: eData) as? Self
    }
}

//--- 數(shù)據(jù)實體 必須遵循: NSCopying, NSSecureCoding協(xié)議:以支持編解碼功能,以持久化保存到磁盤中;
class YeDataEntityToEg: NSObject, NSCoding, NSSecureCoding {
    // 協(xié)議屬性:
    static var supportsSecureCoding: Bool = true
    
    // 自定義的 屬性字段:
    var eID : Int = 0
    var eName : String = "Name"
    var eAge : String = "15"
    var eTye : String = "Tye"
    //var eImage : UIImage = UIImage()
    
    // 1. 解析 Json:
    init?(eData:Data) {
        // 解析 Json 轉(zhuǎn)換成字典:
        guard let eObj = try? JSONSerialization.jsonObject(with: eData, options: []) as? [String:Any] else { return nil }
            
        //--- 字段解析:
        guard let eIDLS = eObj["id"] as? Int else { return nil }
        self.eID = eIDLS
        
        // 二級 字典:
        guard let eDic = eObj["dic"] as? [String: Any] else { return nil }
        
        if let eNameLS = eDic["name"] as? String{
            self.eName = eNameLS
        }
        
        if let eAgeLS = eDic["age"] as? String{
            self.eAge = eAgeLS
        }
        
        // 三級 字典:
        if let eDicT = eDic["dicT"] as? [String: Any] {
            if let eTyeLS = eDicT["tye"] as? String {
                self.eTye = eTyeLS
            }
        }
        
    }
    
    //--- 協(xié)議方法:
    // 2. 解碼:
    required init?(coder: NSCoder) {
        super.init()
        self.eID = coder.decodeInteger(forKey: "id")
        self.eName = coder.decodeObject(forKey: "name") as! String
        self.eAge = coder.decodeObject(forKey: "age") as! String
        self.eTye = coder.decodeObject(forKey: "tye") as? String ?? "Tye"
    }
    
    // 3. 編碼:
    func encode(with coder: NSCoder) {
        coder.encode(self.eID, forKey: "id")
        coder.encode(self.eName, forKey: "name")
        coder.encode(self.eAge, forKey: "age")
        coder.encode(self.eTye, forKey: "tye")
    }
    
}
    1. 網(wǎng)絡(luò)接口類: (接口與數(shù)據(jù)實體類對應(yīng)配套) YeHttpToEg.swift
//
//  YeHttpRequestToEg.swift
//  TyeProject
//
//  Created by Tye on 20../../..
//

import Foundation

// 請求: (用結(jié)構(gòu)體更為輕量) , 遵循協(xié)議:
struct YeHttpToEg: YeProtocolForHttp{
    typealias eDataEntity = YeDataEntityToEg // 確定返回的數(shù)據(jù)實體類;
    
    var eStrUrl: String = "json/josnUser.json" // 接口: 具體的請求地址;
    
    var eEnumType: YeHttpRequestTypeEnum = .GET
    
    var eDicParameter: [String : Any] = [:]
}
    1. ViewCtrl 中 調(diào)用:
//
//  YeUserToEgVC.swift
//  TyeProject
//
//  Created by Tye on 20../../..
//

import UIKit
import PKHUD
import Toaster

class YeUserToEgVC: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        yeHttpSendToEg()
    }
    
    // 發(fā)送Http請求 示例:
    func yeHttpSendToEg(){
        HUD.show(.progress)
        YeHttpRequest().yeSend(YeHttpToEg()) { eDataEntity in
            HUD.hide(animated: true)
            if let eEntity = eDataEntity{
                print("---\(eEntity.eID)--")
                print("---\(eEntity.eName)--")
                
                // Save To Loc:
                let eBl = TyeTool.yeSaveObjectToUserDefaults(eObject: eEntity, eStrKey: "TyeKeyEntityEg")
            }
            else
            {
                Toast(text: "網(wǎng)絡(luò)錯誤").show()
            }
        }
    }
    
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容