IOS 16 封装网络请求和log打印

本文基于 IOS 14 封装网络请求框架 对网络请求框架Moya的二次封装,并实现log打印、loading提示等。

封装前接口请求

Swift 复制代码
let provider = MoyaProvider<DefaultService>()
 
// 广告列表
provider.rx.request(.ads(position: VALUE0))
            .asObservable()
            .mapString()
            .mapObject(ListResponse<Ad>.self)
            .subscribe { event in
                switch(event){
                case .next(let data):
                    print(data.data.data?[0].title!)
                case .error(let error):
                    print("error \(error)")
                case .completed:
                    print("completed")
                }
            }.disposed(by: rx.disposeBag)

每次请求接口都需要创建MoyaProvider对象,比较浪费资源,故使用单例进行封装,APP进程内只创建一个MoyaProvider对象进行复用。

封装网络请求仓库

封装DefaultRepository网络请求仓库,实现MoyaProvider对象复用和使用插件实现log打印和loading提示

创建单例

Swift 复制代码
class DefaultRepository{
    static let shared = DefaultRepository()
    
    private var provider : MoyaProvider<DefaultService>!

    /// 私有构造方法
    private init() {
        provider = MoyaProvider<DefaultService>()
    }
}

实现log打印

Swift 复制代码
    /// 私有构造方法
    private init() {
        //插件列表
        var plugins:[PluginType] = []
        if Config.DEBUG {
            //表示当前是调试模式
            //添加网络请求日志插件
            plugins.append(NetworkLoggerPlugin(configuration: NetworkLoggerPlugin.Configuration(logOptions: .verbose)))
        }
        
        provider = MoyaProvider<DefaultService>(plugins: plugins)
    }

实现loading提示

Swift 复制代码
    /// 私有构造方法
    private init() {
        //插件列表
        var plugins:[PluginType] = []
      
        //网络请求加载对话框
        let networkActivityPlugin =  NetworkActivityPlugin{ change, target in
            //changeType类型是NetworkActivityChangeType
            //通过它能监听到开始请求和结束请求

            //targetType类型是TargetType
            //就是我们这里的service
            //通过它能判断是那个请求
            if change == .began {
                //开始请求
                let targetType = target as! DefaultService
                
                switch(targetType){
                case .sheets,.register:
                    DispatchQueue.main.async {
                        //切换到主线程
                        SuperToast.showLoading()
                    }
                default:
                    break
                }
            } else {
                //结束请求
                DispatchQueue.main.async {
                    //切换到主线程
                    SuperToast.hideLoading()
                }
            }
        }
        
        
        plugins.append(networkActivityPlugin)
        
        provider = MoyaProvider<DefaultService>(plugins: plugins)
    }

实现接口封装

Swift 复制代码
    /// 歌单列表
    /// - Parameter size: <#size description#>
    /// - Returns: <#description#>
    func sheets(size:Int) -> Observable<ListResponse<Sheet>> {
        return provider.rx
            .request(.sheets(size: size))
            .asObservable()
            .mapString()
            .mapObject(ListResponse<Sheet>.self)
    }
    
    /// 歌单详情
    /// - Parameter data: <#data description#>
    /// - Returns: <#description#>
    func sheetDetail(_ data:String) -> Observable<DetailResponse<Sheet>> {
        return provider.rx
                .request(.sheetDetail(data: data))
                .asObservable()
                .mapString()
                .mapObject(DetailResponse<Sheet>.self)
    }

DefaultRepository类完整代码

Swift 复制代码
//
//  DefaultRepository.swift
//  网络请求仓库
//
//  Created by jin on 2024/8/27.
//

import Foundation

//导入响应式编程框架
import RxSwift

//导入JSON解析框架
import HandyJSON

//导入网络框架
import Moya

class DefaultRepository{
    static let shared = DefaultRepository()
    
    private var provider : MoyaProvider<DefaultService>!
    
    /// 歌单列表
    /// - Parameter size: <#size description#>
    /// - Returns: <#description#>
    func sheets(size:Int) -> Observable<ListResponse<Sheet>> {
        return provider.rx
            .request(.sheets(size: size))
            .asObservable()
            .mapString()
            .mapObject(ListResponse<Sheet>.self)
    }
    
    /// 歌单详情
    /// - Parameter data: <#data description#>
    /// - Returns: <#description#>
    func sheetDetail(_ data:String) -> Observable<DetailResponse<Sheet>> {
        return provider.rx
                .request(.sheetDetail(data: data))
                .asObservable()
                .mapString()
                .mapObject(DetailResponse<Sheet>.self)
    }
    
    /// 私有构造方法
    private init() {
        //插件列表
        var plugins:[PluginType] = []
        if Config.DEBUG {
            //表示当前是调试模式
            //添加网络请求日志插件
            plugins.append(NetworkLoggerPlugin(configuration: NetworkLoggerPlugin.Configuration(logOptions: .verbose)))
        }
        
        //网络请求加载对话框
        let networkActivityPlugin =  NetworkActivityPlugin{ change, target in
            //changeType类型是NetworkActivityChangeType
            //通过它能监听到开始请求和结束请求

            //targetType类型是TargetType
            //就是我们这里的service
            //通过它能判断是那个请求
            if change == .began {
                //开始请求
                let targetType = target as! DefaultService
                
                switch(targetType){
                case .sheets,.register:
                    DispatchQueue.main.async {
                        //切换到主线程
                        SuperToast.showLoading()
                    }
                default:
                    break
                }
            } else {
                //结束请求
                DispatchQueue.main.async {
                    //切换到主线程
                    SuperToast.hideLoading()
                }
            }
        }
        
        
        
        plugins.append(networkActivityPlugin)
        
        provider = MoyaProvider<DefaultService>(plugins: plugins)
    }
}

封装后接口使用

Swift 复制代码
    DefaultRepository.shared.sheets(size: 10)
            .subscribeSuccess { data in
                print(data)
            }.disposed(by: rx.disposeBag)
相关推荐
Anhty1 小时前
手机端叮咚变声器2026实测:功能表现、优缺点完整解析
功能测试·ios·智能手机·安卓
SameX4 小时前
后台定位耗电的问题,我花两年把它压到了3%-5%
ios
星辰即远方17 小时前
计算器仿写总结
学习·ui·ios·cocoa·xcode
游戏开发爱好者820 小时前
系统状态:专为iPhone和iPad设计的实时系统性能监控工具全面介绍
android·ios·小程序·uni-app·iphone·webview·ipad
2501_915909061 天前
全面解析iOS应用上架到App Store的完整流程与关键注意事项
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张1 天前
抓包鹰 电脑本机网络连接表怎么看?哪些程序在联网 进程归属与可疑 IP 追溯
网络协议·计算机网络·网络安全·ios·adb·https·udp
2501_915918411 天前
免 Xcode 开发 iOS,工具链替代方案与编译、签名、安装
ide·vscode·macos·ios·个人开发·xcode·敏捷流程
初级代码游戏1 天前
iOS开发 Swift 速记5:高级运算符
ios·移动开发·swift
初级代码游戏1 天前
iOS开发 Swift 速记4:函数与闭包
开发语言·ios·swift
2501_915106321 天前
iOS 证书类型及作用说明 账号证书与签名配置的完整解读
android·ios·小程序·https·uni-app·iphone·webview