AFN的二次封装使用

一般情况下,我们的网络请求可能是这样写的

- (void)getActivityWithPage:(NSInteger)pageNum
                       Size:(NSInteger)size
                       Type:(NSInteger)type
                   Latitude:(NSNumber*)latitude
                  Longitude:(NSNumber*)Longitude
                    Success:(SuccessFinishedBlock)success
                   Failture:(FailtureFinishedBlock)failture;

实现部分可能是这样(判断网络状态的我就省略了哈,项目中,是需要加上网络状态判断的)

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:baseUrl]];
        manager.requestSerializer.timeoutInterval = 10.f;
        NSMutableDictionary *para = [NSMutableDictionary dictionary];
        //设置需要传递的参数para
        [manager GET:kPEActivity parameters:para progress:^(NSProgress * _Nonnull downloadProgress) {
        } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
            //这里,大部分就是转成自己的model,可以直接用MJExtension,很方便的
            success(model);//存储数据成功的model
        } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
            NSLog(@"%@",error);
            failture(error);
        }];

不同的页面,会有很多不同的请求,我们就要一个一个去写类似的方法,当然,这样的好处是,通过请求名字,就可以知道是哪个请求,对数据的处理,也有很大的自由度。
一般情况下,如果后台是一个有点经验的,返回的数据格式都是固定的,我们在请求成功里边的处理,也是有很多重复的代码,这种情况,就需要封装了,可以这样写:

- (void)universalNetworkRequestWithNetConnectType:(RequestType)type requestURL:(NSString *)url model:(Class)modelClass para:(NSDictionary *)para success:(SuccessBlock)success successCodeError:(SuccessBlock)successCodeError fail:(DefeatedBlock)fail netError:(NetworkError)netError;

解释一下参数,RequestType:定义的请求方式枚举(get post等)。model:如果数据请求成功,需要将数据转化成这个model。para:请求参数。success:数据请求成功(根据后台的返回码来确定)。successCodeError:网络请求成功,但是返回的数据不是你要的数据(比如数据正确是200,但是有时候根据业务需求,会返回别的码,比如你在别的地方登录了什么的)。fail:网络请求失败。netError:没有网络。
方法实现部分:

if ([RNetStatus networkIsAvailable]) {
        NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithDictionary:para];
        switch (type) {
            case get:
                [self getNetworkRequestWithNetConnectRequestURL:url model:modelClass para:dic success:success successCodeError:successCodeError fail:fail];
                break;
            case post:
                [self postNetworkRequestWithNetConnectRequestURL:url model:modelClass para:dic success:success successCodeError:successCodeError fail:fail];
                break;
            case upload:
                //上传暂时没写,后期会补上
                break;
        }
    }else{
        netError();
    }

根据不同的方法,来调afn响应的方法,这里,我只写出一个get请求的实现,post是一样的

- (void)getNetworkRequestWithNetConnectRequestURL:(NSString *)url model:(Class)model_class para:(NSDictionary *)para success:(SuccessBlock)success successCodeError:(SuccessBlock)successCodeError fail:(DefeatedBlock)fail{

    [self.sessinoManager GET:url parameters:para progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        REFLog(@"--request success --%@--para is --%@", responseObject, para);
        
        if ([responseObject[@"resCode"] intValue] == 200) {
            if (model_class == nil) {
                success(responseObject[@"data"]);
            }else{
                //如果data是数组,并且只有一层数据结构
                if ([responseObject[@"data"] isKindOfClass:[NSArray class]]) {
                    NSArray *result = [model_class mj_objectArrayWithKeyValuesArray:responseObject[@"data"]];
                    success(result);
                }else{//data直接就是一个字典
                    success([model_class mj_objectWithKeyValues:responseObject[@"data"]]);
                }
            }
        }else{
                successCodeError(responseObject[@"resMsg"]);
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        fail(error);
    }];
}

解释一下代码:
如果model不是nil,意思就是得到的数据,可以转化成model,这里,就只是处理了返回的数据直接能转化成model,或者返回的数据是个数组,数组里存的就是字典。如果数据层级很多,这个方法是不适用的,或者写出一个单独的处理数据的函数来处理也是可以的,毕竟层级很多的数据,不是太多。
这里的sessionManager,是一个AFHTTPSessionManager的属性,可以这样懒加载一下

- (AFHTTPSessionManager *)sessinoManager {
    if (!_sessinoManager) {
        _sessinoManager = [[AFHTTPSessionManager manager] initWithBaseURL:base_URL];
        _sessinoManager.requestSerializer.timeoutInterval = kTimeOut;
    }
    return _sessinoManager;
}

直接设置baseurl和超时时间。
使用的时候,可以这样

[[REFNetworkManager manager] universalNetworkRequestWithNetConnectType:get requestURL:@"" model:[Model class] para:@{@"":@""}success:^(id response) {
        [SVProgressHUD dismiss];
    } successCodeError:^(id response) {
        [SVProgressHUD showSuccessWithString:response];
        [refreshComponent endRefreshing];
    } fail:^(NSError *error) {
        [SVProgressHUD showNetTimeout];
    } netError:^{
        [SVProgressHUD showNetWorkError];
    }];

这里,可以自己对SVProgressHUD进行一个简单的封装,用起来也是很方便的。
至于这里边的单利,block之类的,就不一一写出来了,不会的可以自行百度,很简单。

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

推荐阅读更多精彩内容