当前位置: 首页 > news >正文

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

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

封装前接口请求

let provider = MoyaProvider<DefaultService>()// 广告列表
provider.rx.request(.ads(position: VALUE0)).asObservable().mapString().mapObject(ListResponse<Ad>.self).subscribe { event inswitch(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提示

创建单例

class DefaultRepository{static let shared = DefaultRepository()private var provider : MoyaProvider<DefaultService>!/// 私有构造方法private init() {provider = MoyaProvider<DefaultService>()}
}

实现log打印

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

实现loading提示

    /// 私有构造方法private init() {//插件列表var plugins:[PluginType] = []//网络请求加载对话框let networkActivityPlugin =  NetworkActivityPlugin{ change, target in//changeType类型是NetworkActivityChangeType//通过它能监听到开始请求和结束请求//targetType类型是TargetType//就是我们这里的service//通过它能判断是那个请求if change == .began {//开始请求let targetType = target as! DefaultServiceswitch(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)}

实现接口封装

    /// 歌单列表/// - 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类完整代码

//
//  DefaultRepository.swift
//  网络请求仓库
//
//  Created by jin on 2024/8/27.
//import Foundation//导入响应式编程框架
import RxSwift//导入JSON解析框架
import HandyJSON//导入网络框架
import Moyaclass 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! DefaultServiceswitch(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)}
}

封装后接口使用

    DefaultRepository.shared.sheets(size: 10).subscribeSuccess { data inprint(data)}.disposed(by: rx.disposeBag)


http://www.mrgr.cn/news/12762.html

相关文章:

  • 4. shell 自定义变量
  • 畅捷通CRM newleadset.php SQL注入漏洞复现
  • UDS 网络层PDU 类型
  • 开学季有哪些必备的好物?学生家长请收下这份清单
  • git rebase和git merge的区别
  • DRF——pagination分页模块
  • QL5010-16-ASEMI逆变焊机专用整流桥QL5010
  • 【Java】数据类型与变量(一)
  • 山东大数据职称考试复习
  • Getting RateLimitError while implementing openai GPT with Python
  • Android 12系统源码_输入系统(二)InputManagerService服务架构
  • input中文输入频繁触发input方法问题
  • Open3D编译安装
  • 前端数据爬虫之puppeteer
  • 如何实现对象克隆
  • 深入理解Vue的beforeDestroy钩子函数及其实际应用
  • 通过历史进行数据预测的算法
  • layui2.9 树组件默认无法修改节点图标,修改过程记录下
  • TCP系列相关内容
  • 一个很好用的idea插件RestfulTookit-fix