swift - 请问如何使用Alamofire来全局处理一些事件?

查看:169
本文介绍了swift - 请问如何使用Alamofire来全局处理一些事件?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我们在做网络请求的时候,有很多相同的情况需要处理。
比如处理HTTP状态码,很多请求函数都需要处理遇到200、401、500...的情况,
我想把这些处理情况统一起来,每次调用Alamofire来进行网络请求的时候首先调用这个函数。
请问这种情况下怎么封装Alamofire?

解决方案

用 protocol 和 extension. 所有的 请求都实现 protocol, 就行了。让 protocol 的 extension 去实现公共的方法。

给你个例子:
协议文件

import UIKit
import Alamofire

public protocol RequestProtocol {
    var route: String { get }
    var parameters: [String: Any]? { get }
    var method: HTTPMethod { get }
}

extension RequestProtocol {
    var BaseUrl: String {
        return "http://api.chojer.com/"
    }
    
    var url: String {
        return BaseUrl + route
    }
    
    var encoding: URLEncoding {
        return method == .get || method == .head || method == .delete ? URLEncoding.default : URLEncoding.httpBody
    }
    
    var headers: [String: String] {
        return [
            "Accept":"application/json",
            "Api-token": LoginViewController.info.user.token,
            "Api-Device": Sys.shared.device,
            "Api-Os-Name": "IOS",
            "Api-Os-Version": UIDevice.current.systemVersion,
            "Api-Network-Status": ApplicationLunch.networkingStatus,
            "Api-Version": "\(Sys.shared.build)"
        ]
    }
    
}

网络请求封装


import Foundation
import Alamofire
import SwiftyJSON

class RequestProvider {
    
    var target: RequestProtocol!
    
    init(target: RequestProtocol) {
        self.target = target
    }
    
    
    func response(success: ((_ json: JSON)-> Void)? = nil, error: ((_ code: Int)-> Void)? = nil, complete: (()-> Void)? = nil) {
        Alamofire.request(target.url, method: target.method, parameters: target.parameters, encoding: target.encoding, headers: target.headers)
            .responseData { (response) in
                switch response.result {
                case .failure:
                    Notify.whistle(status: NotifyStatus.warning, msg: "网络请求失败,请稍后再试")
                    if let errorEvent = error { return errorEvent(-999) }
                case .success(let data):
                    let json = JSON(data: data)
                    let errCode = json["errCode"].intValue
                    let errMsg = json["errMsg"].stringValue
                    let data =  json["data"]
                    if  errCode == 0 {
                        if let successEvent = success { return successEvent(data) }
                    } else {
                        if errCode == -2 {
                            NavigationController.defaultViewController.showDetailViewController(LoginViewController(), sender: nil)
                        }
                        Notify.whistle(status: NotifyStatus.danger, msg: errMsg)
                        if let errorEvent = error { return errorEvent(errCode) }
                    }
                }
                if let completeEvent = complete { return completeEvent() }
        }
    }
    
    func responseSuccess(success: ((_ json: JSON)-> Void)? = nil) {
        return response(success: success, error: nil, complete: nil)
    }
    
    func responseError(error: ((_ code: Int)-> Void)? = nil) {
        return response(success: nil, error: error, complete: nil)
    }
    
    func responseComplete(complete: (()-> Void)? = nil) {
        return response(success: nil, error: nil, complete: complete)
    }
    
}

具体的一个网络请求

import Foundation
import Alamofire

enum HomeRequestTarget: RequestProtocol {

    case index // GET    /photos
    case create // GET    /photos/create
    case store // POST    /photos
    case show() // GET    /photos/{photo}
    case edit // GET    /photos/{photo}/edit
    case update // PUT/PATCH    /photos/{photo}
    case destroy // DELETE    /photos/{photo}
    
    var route: String {
        return ""
    }
    var parameters: [String: Any]? {
        return nil
    }
    var method: HTTPMethod {
        return .get
    }
}

执行网络请求时,只需要这样访问就OK了。这样,如果遇到同样的网络请求错误信息,可以统一处理,也可以根据需要传入回调函数,进行错误处理。完美。

RequestProvider(target: HomeRequestTarget.index).responseSuccess { (json) in
            Notify.whisper(vc: self, status: NotifyStatus.success, msg: "登陆成功,欢迎回来")
            LoginViewController.update(json: json["user_info"])
            if json["version_info"].exists() {
                let confirm = ConfirmPopView()
                confirm.label(label: "检测到新的版本,建议您及时更新", confirmLabel: "确认更新", cancelLabel: "稍后提醒")
                confirm.proxy = self
                confirm.show()
            }
        }

这篇关于swift - 请问如何使用Alamofire来全局处理一些事件?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆