浅谈iOS网络层架构

在大多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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271