美文网首页
浅谈iOS网络层架构

浅谈iOS网络层架构

作者: 隔壁班小明 | 来源:发表于2023-09-10 11:22 被阅读0次

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

    相关文章

      网友评论

          本文标题:浅谈iOS网络层架构

          本文链接:https://www.haomeiwen.com/subject/vjolvdtx.html