swift3面向协议编程实现Alamofire封装

本文介绍了如何使用Swift3通过面向协议编程的方式对Alamofire进行封装,抽离业务逻辑,关注点集中在业务需求上。通过创建`Requestable`协议,定义URLString、请求方法、参数等属性,并实现数据解析逻辑,使得 ViewModel 只需关注数据解析。示例展示了具体协议实现和数据处理方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、原先的实现过程我们一般使用的是Alamofire,对其单例封装

//
//  NetworkTools.swift
//
//  Created by targetcloud on 2017/3/26.
//  Copyright © 2017年 targetcloud. All rights reserved.
//

//原来1
import UIKit
import Alamofire

enum MethodType {
    case get
    case post
}

class NetworkTools {
    static let share : NetworkTools = NetworkTools()
    
    private init(){}
    
    //参数的finishedCallback闭包在26行使用了,而使用的环境又是一个闭包,则需要加@escaping
    func requestData(_ type : MethodType, URLString : String, parameters : [String : Any]? = nil, finishedCallback :  @escaping (_ result : Any) -> ()) {
        let method = type == .get ? HTTPMethod.get : HTTPMethod.post
        Alamofire.request(URLString, method: method, parameters: parameters).responseJSON { (response) in
            guard let result = response.result.value else {
                print(response.result.error ?? " --- 网络请求发生了错误 --- ")
                return
            }
            finishedCallback(result)
        }
    }
}

2、在ViewModel中调用自己的封装的网络工具类

//
//  TGGiftViewModel.swift
//
//  Created by targetcloud on 2017/3/26.
//  Copyright © 2017年 targetcloud. All rights reserved.
//

import UIKit
//原来2

class TGGiftViewModel: NSObject {
    var results : Array<TGGiftPackage> = []
    
    func requestGiftData(_ complection : @escaping () -> ()) {
        NetworkTools.share.requestData(.get, URLString: "http://qf.56.com/pay/v4/giftList.ios", parameters: ["type":0,"page":1,"rows":150]) { (result) in
//            print(result)
            guard let resultDict = result as? [String:Any] else {return}
            guard let typesDictData = resultDict["message"] as? [String:Any] else {return}
            for i in 0..<typesDictData.count{
                guard let typeDict = typesDictData["type\(i+1)"] as?[String:Any] else {continue}
                self.results.append(TGGiftPackage(dict:typeDict))
            }
            self.results = self.results.filter({ $0.t != 0 }).sorted(by: { $0.t > $1.t })
//            print(self.results)
            complection()
        }
    }
}

附VM中使用的两个Model,作为例子,读者可以忽略(注意这里使用MVVM设计模式)

//
//  TGGiftPackage.swift
//
//  Created by targetcloud on 2017/3/26.
//  Copyright © 2017年 targetcloud. All rights reserved.
//

import UIKit

class TGGiftPackage: NSObject {
    var t : Int = 0
    var title : String = ""
    var giftModels : [TGGiftModel] = []
    
    init(dict : [String:Any]) {
        super.init()
        setValuesForKeys(dict)
    }
    
    override func setValue(_ value: Any?, forKey key: String) {
        if key == "list"{
            if let arr = value as? [[String : Any]]{
                for dict in arr{
                    giftModels.append(TGGiftModel(dict:dict))
                }
            }
        }else{
            super.setValue(value, forKey: key)
        }
    }
    
    override func setValue(_ value: Any?, forUndefinedKey key: String) {
        
    }
}

//
//  TGGiftModel.swift
//
//  Created by targetcloud on 2017/3/26.
//  Copyright © 2017年 targetcloud. All rights reserved.
//

import UIKit

class TGGiftModel: NSObject {
    
    var coin :Int = 0
    var img : String = ""
    var img2 : String = ""
    var gUrl : String = ""
    var subject : String = "" {
        didSet{
            if subject.contains("有声"){
                subject = subject.replacingOccurrences
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值