本文基于 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)