在大多app中基本的模式都是,从后端请求数据,展示数据,到下一个页接着请求数据展示数据,记录用户操作,传给后端。
在这个过程中请求接口是必须的,所以iOS网络层在一个项目里是至关重要的。
关于iOS的网络请求,第一反应都是AFNetWorking。几乎所有的OC项目都是用的这个。网络层的设计也几乎都是在说对于AF的封装。
现在对于网络层大的区分,主要是集约型和离散型。
集约型:就是值对AF封装一个统一的方法。所有的请求都调用统一的方法。好处就是简单,结构清晰,调用方便。适用一些小型的项目。
离散型:其实根本也是集约型,但是对应不同的接口进行不同的封装,让接口更加定制化。好处就是定制化,接口代码方便查找,好管理。适用复杂的项目。
这里说一下好几年前写的那个文章AF3.0封装(MB管理集成) - 简书 (jianshu.com) 这种方式应该也是应该也算是离散型吧....
这次要说的当然不是上面那种,不然也不用再写个文章(废话ing)
好了下面进入正题。这次我们要说的是整体使用命令模式,把每个请求都封装成一个类这种模式(对和猿题库那个差不多,我再最开始了解这种方式的时候也是看的这个)。同时实现数据自动解析。直接给业务端交付可用的数据。
一,整体结构:就像上面说的整体还是用命令模式。然后每一个命令都是request。这里不同的是我打算直接交付给调用者一个可用的数据。所以这个request其实也是一个model类。想了好久用requestModel作为后缀命名了。
二,具体代码:注释写的比较多,所以不讲解了(#.#)。这个是我从我现在项目里扒出来的,没实际测试过。还是多多理解思路吧。代码比较多这里只放了头文件具体代码放在git上了。git地址:sweetKnight/SWRequest: 一个离散型的网络库 (github.com)
1.request:
//
// SWBaseRequst.h
// SWNetwork
//
// Created by fengjianfeng on 2023/5/8.
//
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
//请求方式
typedef NS_ENUM(NSInteger, SWRequestMethod) {
SWRequestMethodGET = 0,
SWRequestMethodPOST,
SWRequestMethodHEAD,
SWRequestMethodPUT,
SWRequestMethodDELETE,
SWRequestMethodPATCH,
};
//请求参数格式
typedef NS_ENUM(NSInteger, SWRequestSerializerType) {
SWRequestSerializerTypeHTTP = 0,
SWRequestSerializerTypeJSON,
};
//AF关于上传文件相关的代码
@protocol AFMultipartFormData;
typedef void (^AFConstructingBlock)(id<AFMultipartFormData> formData);
typedef void (^AFURLSessionTaskProgressBlock)(NSProgress *);
//接口完成回调代理
@protocol SWRequestDelegate;
//接口生命周期代理
@protocol SWRequestLifeCycleDelegate;
@interface SWBaseRequest : NSObject
#pragma mark - Request and Response Information
/** 请求任务 */
@property (nonatomic, strong) NSURLSessionTask *requestTask;
/** 当前请求 */
@property (nonatomic, strong, readonly) NSURLRequest *currentRequest;
/** 返回值 */
@property (nonatomic, strong, readonly) NSHTTPURLResponse *response;
/** 接口返回的参数 */
@property (nonatomic, strong, nullable) id responseObject;
/** 接口报错信息 */
@property (nonatomic, strong, nullable) NSError *error;
/** tag标识 */
@property (nonatomic) NSInteger tag;
/** 接口回调代理 */
@property (nonatomic, weak, nullable) id<SWRequestDelegate> delegate;
/** 生命周期代理 */
@property (nonatomic, weak, nullable) id<SWRequestLifeCycleDelegate> lifeCycleDelegate;
/** 上传文件 */
@property (nonatomic, copy, nullable) AFConstructingBlock uploadBodyBlock;
/** 上传进度 */
@property (nonatomic, copy, nullable) AFURLSessionTaskProgressBlock uploadProgressBlock;
/** 下载文件路径 */
@property (nonatomic, strong, nullable) NSString *downloadPath;
/** 下载进度 */
@property (nonatomic, copy, nullable) AFURLSessionTaskProgressBlock downloadProgressBlock;
#pragma mark - 外部调用
//开始
- (void)start;
//停止
- (void)stop;
#pragma mark - 子类重写,设置request
//url不变的部分,一般写入host
- (NSString *)baseUrl;
//回合baseUrl拼接一下
- (NSString *)requestUrl;
//超时时间设置,默认60s
- (NSTimeInterval)requestTimeoutInterval;
//请求参数
- (nullable id)requestArgument;
//请求类型
- (SWRequestMethod)requestMethod;
//请求参数类型
- (SWRequestSerializerType)requestSerializerType;
//请求头
- (nullable NSDictionary<NSString *, NSString *> *)requestHeaderFieldValueDictionary;
//接口成功,未调用回调的时候
- (void)requestCompleteFilter;
//接口失败,未调用回调的时候
- (void)requestFailureFilter;
@end
@protocol SWRequestDelegate <NSObject>
@optional
//接口成功回调
-(void)requestFinished:(__kindof SWBaseRequest *)request;
//接口失败回调
-(void)requestFailed:(__kindof SWBaseRequest *)request;
@end
@protocol SWRequestLifeCycleDelegate <NSObject>
@optional
//将要开始
-(void)requestWillStart:(id)request;
//将要结束
-(void)requestWillStop:(id)request;
//已经结束
-(void)requestDidStop:(id)request;
@end
NS_ASSUME_NONNULL_END
2.agent
//
// SWNetworkAgent.h
// SWNetwork
//
// Created by fengjianfeng on 2023/5/8.
// 实际发起请求的类
#import <Foundation/Foundation.h>
#import "SWBaseRequest.h"
NS_ASSUME_NONNULL_BEGIN
@interface SWNetworkAgent : NSObject
+(SWNetworkAgent *)sharedAgent;
-(void)addRequest:(SWBaseRequest *)request;
-(void)cancelRequest:(SWBaseRequest *)request;
-(void)cancelAllRequests;
@end
NS_ASSUME_NONNULL_END
3.requestModel
//
// SWBaseRequestModel.h
// SWNetwork
//
// Created by fengjianfeng on 2023/9/9.
//
#import "SWBaseRequest.h"
#import "NSObject+YYModel.h"
#import "SWErrorModel.h"
NS_ASSUME_NONNULL_BEGIN
@interface SWBaseRequestModel : SWBaseRequest<YYModel>
/** 状态码 */
@property (nonatomic, assign) NSInteger status;
/** 数据原型 */
@property (nonatomic, strong) id data;
/** 是否接收过数据 */
@property (nonatomic, assign) BOOL modelHasData;
/** 当data是数组的时候,已自身为数组里的类型,解出的集合 */
@property (nonatomic, strong) NSArray * baseDataArray;
/** 当data是数组的时候,可以通过外面传数组里对象的类 */
@property (nonatomic, copy) NSString * arrayItemClassName;
/** 接口错误信息 */
@property (nonatomic, strong) SWErrorModel * errorModel;
+(NSArray<NSString *> *)modelPropertyBlacklist;
@end
NS_ASSUME_NONNULL_END
网友评论