美文网首页
OC版本的Moya插件网络

OC版本的Moya插件网络

作者: 弹吉他的少年 | 来源:发表于2022-01-14 09:23 被阅读0次

    插件版网络请求架构,支持批量操作和链式操作

    • 熟悉swift的朋友应该都知道一款优秀的三方库Moya,插件版网络请求是真香,于是乎借鉴思路制作一款纯oc版本的插件网络请求库

    • 熟悉oc的朋友又应该都知道一款优秀的三方库YTKNetwork,基于对象的协议版网络请求,然后他的批量网络请求和链式网络请求也超级香

    • 结合两者部分优点,制作一款纯OC版 批量 和 链式 插件版网络请求库。

    • 目前整理九款插件:解析插件,缓存插件,配置自建证书插件,加载提示插件,修改请求插件,日志抓包插件,错误码插件,刷新插件,网络错误和空数据插件

    功能清单

    插件版网络请求可以更方便快捷的定制专属网络请求,并且支持批量操作,链式操作

    主要功能清单如下:

    • 支持基本的网络请求,下载上传文件
    • 支持配置通用请求跟路径,通用参数等
    • 支持设置加载和提示框插件
    • 支持解析结果插件
    • 支持网络缓存插件
    • 支持配置自建证书插件
    • 支持修改请求体和获取响应结果插件
    • 支持网络日志抓包插件
    • 支持刷新加载更多插件
    • 支持错误码解析插件
    • 支持错误和空数据UI展示插件
    • 支持批量操作
    • 支持链式网络请求

    使用教程

    Network版块

    KJBaseNetworking:网络请求基类,基本的网络请求,上传下载文件等方法

    /// 根路径地址
    @property (nonatomic, strong, class) NSString *baseURL;
    /// 基本参数,类似:userID,token等
    @property (nonatomic, strong, class) NSDictionary *baseParameters;
    

    KJNetworkingRequest:请求体,设置网络请求相关参数,其中包含参数,请求方式,插件等等
    KJNetworkingResponse:响应请求结果,获取插件之间产生的数据等等
    KJNetworkingType:汇总所有枚举和回调声明
    KJNetworkBasePlugin:插件基类,插件父类
    KJNetworkPluginManager:插件管理器,中枢神经

    /// 插件版网络请求
    /// @param request 请求体
    /// @param success 成功回调
    /// @param failure 失败回调
    + (void)HTTPPluginRequest:(KJNetworkingRequest *)request 
                      success:(KJNetworkPluginSuccess)success 
                      failure:(KJNetworkPluginFailure)failure;
    

    KJNetworkingDelegate:插件协议,管理网络请求结果

    • 目前抽离出以下5条协议方法,其中大致分为开始时刻、网络请求时刻、网络成功、网络失败、最终返回
    /// 开始准备网络请求
    /// @param request 请求相关数据
    /// @param endRequest 是否结束下面的网络请求
    /// @return 返回准备插件处理后的数据
    - (KJNetworkingResponse *)prepareWithRequest:(KJNetworkingRequest *)request endRequest:(BOOL *)endRequest;
    
    /// 网络请求开始时刻请求
    /// @param request 请求相关数据
    /// @param stopRequest 是否停止网络请求
    /// @return 返回网络请求开始时刻插件处理后的数据
    - (KJNetworkingResponse *)willSendWithRequest:(KJNetworkingRequest *)request stopRequest:(BOOL *)stopRequest;
    
    /// 成功接收数据
    /// @param request 请求相关数据
    /// @param againRequest 是否需要再次请求该网络
    /// @return 返回成功插件处理后的数据
    - (KJNetworkingResponse *)succeedWithRequest:(KJNetworkingRequest *)request againRequest:(BOOL *)againRequest;
    
    /// 失败处理
    /// @param request 请求相关数据
    /// @param againRequest 是否需要再次请求该网络
    /// @return 返回失败插件处理后的数据
    - (KJNetworkingResponse *)failureWithRequest:(KJNetworkingRequest *)request againRequest:(BOOL *)againRequest;
    
    /// 准备返回给业务逻辑时刻调用
    /// @param request 请求相关数据
    /// @param error 错误信息
    /// @return 返回最终加工之后的数据
    - (KJNetworkingResponse *)processSuccessResponseWithRequest:(KJNetworkingRequest *)request error:(NSError **)error;
    

    Plugins

    目前已有13款插件供使用:

    Chain

    • 链式网络请求其实主要用于管理有相互依赖的网络请求,它实际上最终可以用来管理多个拓扑排序后的网络请求。
    // 测试链式网络请求
    - (void)testChainNetworking{
        XCTestExpectation * expectation = [self expectationWithDescription:@"test chain."];
        
        KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
        request.method = KJNetworkRequestMethodGET;
        request.ip = @"https://www.httpbin.org";
        request.path = @"/ip";
        request.responseSerializer = KJSerializerJSON;
        
        [KJNetworkChainManager HTTPChainRequest:request failure:^(NSError * error) {
            XCTFail(@"%@", error.localizedDescription);
        }]
        .chain(^__kindof KJNetworkingRequest * _Nullable(id _Nonnull responseObject) {
            KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
            request.ip = @"https://www.httpbin.org";
            request.path = @"/post";
            request.params = {
                "ip": responseObject["origin"]
            };
            return request;
        })
        .lastChain(^(id  _Nonnull responseObject) {
            [expectation fulfill];
        });
        
        [self waitForExpectationsWithTimeout:300 handler:nil];
    }
    

    更多关于链式插件网络处理.👒👒

    Batch

    • 关于批量网络请求,提供设置最大并发数量,失败调用次数,错误重连时机等配置信息
    // 测试批量网络请求
    - (void)testBatchNetworking{
        XCTestExpectation * expectation = [self expectationWithDescription:@"test batch."];
        
        NSMutableArray * array = [NSMutableArray array];
        {
            KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
            request.method = KJNetworkRequestMethodGET;
            request.path = @"/headers";
            request.responseSerializer = KJSerializerJSON;
            [array addObject:request];
        }{
            KJNetworkingRequest * request = [[KJNetworkingRequest alloc] init];
            request.method = KJNetworkRequestMethodGET;
            request.path = @"/ip";
            [array addObject:request];
        }
        
        KJBatchConfiguration * configuration = [KJBatchConfiguration sharedBatch];
        configuration.maxQueue = 3;
        configuration.requestArray = array.mutableCopy;
        
        [KJNetworkBatchManager HTTPBatchRequestConfiguration:configuration reconnect:^BOOL(NSArray<KJNetworkingRequest *> * _Nonnull reconnectArray) {
            return YES;
        } complete:^(NSArray<KJBatchResponse *> * _Nonnull result) {
            [expectation fulfill];
        }];
        
        [self waitForExpectationsWithTimeout:300 handler:nil];
    }
    

    更多关于批量插件网络处理.👒👒

    最后

    • 搞OC的小伙伴们推荐使用该插件KJNetworkPlugin,搞Siwft的小伙伴还是使用Moya吧,是真的香。
    • 再附上一个开发加速库,简简单单的如此便利 .🎷
    • KJCategoriesDemo地址 🎷 喜欢的老板们可以点个小星星.
    • 等我有时间空闲再来封装一套响应式插件网络请求吧,所以老板们觉得有帮助还望点个星🌟。
    • 传送门:KJNetworkPluginDemo
    • End .🎷

    相关文章

      网友评论

          本文标题:OC版本的Moya插件网络

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