AF3.0封装(MB管理集成)

随着ipv6的使用,AFNetWoring发布了3.0版本,刚刚完成的这个项目我用的是AF3.0,这里有这次使用AF3.0的封装,简单说一下都是怎么做的。

1.单例形式创建AFHTTPSessionManager的子类。

+ (instancetype)sharedClient {
    static AFAppDotNetAPIClient *_sharedClient = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _sharedClient = [[AFAppDotNetAPIClient alloc] initWithBaseURL:[NSURL URLWithString:AFAppDotNetAPIBaseURLString]];
        _sharedClient.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript",@"text/html",@"text/plain",nil];
        _sharedClient.requestSerializer.timeoutInterval = 30;     // 设置超时时间30s
        
        //支持https,SSL证书加密
//        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
//        securityPolicy.allowInvalidCertificates = YES;
//        securityPolicy.validatesDomainName = NO;
//        _sharedClient.securityPolicy = securityPolicy;
    });
    return _sharedClient;
}

2.封装基本通用的请求方法

.h接口文件

/**
 *  返回json结构为CommenReturnModel的HTTP请求
 *
 *  @param parameters 参数集,为#NSDictionary#类型
 *  @param POST       地址,除BaseUrl之外的部分
 *  @param block      block参数
 *
 *  @return           返回值
 */

+(NSURLSessionDataTask*)normalHttpRequestWithParameters:(NSDictionary*)parameters POST:(NSString*)POST resultBlock:(void(^)(NSDictionary* commentReturnModel, NSError*error))block;
/*!
 *  上传图片接口
 *
 *  @param parameters 参数集,为#NSDictionary#类型
 *  @param picDic     图片字典{key为推荐命名。value为图片}
 *  @param POST       地址,除BaseUrl之外的部分
 *  @param block      block参数
 *
 *  @return           返回值
 */
+(NSURLSessionDataTask*)uploadHttpRequestWithParameters:(NSDictionary*)parameters PictureDic:(NSDictionary *)picDic POST:(NSString*)POST resultBlock:(void(^)(NSDictionary* commentReturnModel, NSError*error))block;

.m实现文件

//返回json结构为CommenReturnModel的HTTP请求
+(NSURLSessionDataTask*)normalHttpRequestWithParameters:(NSDictionary *)parameters POST:(NSString *)POST resultBlock:(void (^)(NSDictionary *, NSError *))block{
    DEBUGLog(@"%@%@?%@",AFAppDotNetAPIBaseURLString, POST, [self getStringWithDictionary:parameters]);
    dispatch_async(dispatch_get_main_queue(), ^{
        [[MbprogressTool standard] showprogressHUD];
    });
    NSString * post = [NSString stringWithFormat:@"%@%@",AFAppDotNetAPIBaseURLString,POST];
    return [[AFAppDotNetAPIClient sharedClient] POST:post parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        DEBUGLog(@"%@",responseObject);
        NSAssert([responseObject isKindOfClass:[NSDictionary class]], @"JSON结构返回与约定不符");
        if (block) {
            block(responseObject, nil);
        }
        [[MbprogressTool standard] hiddenProgressHUD];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (block) {
            block(nil, error);
        }
        [[MbprogressTool standard] hiddenProgressHUD];
    }];
}

//图片上传
+(NSURLSessionDataTask *)uploadHttpRequestWithParameters:(NSDictionary *)parameters PictureDic:(NSDictionary *)picDic POST:(NSString *)POST resultBlock:(void (^)(NSDictionary *, NSError *))block{
    NSString * post = [NSString stringWithFormat:@"%@%@",AFAppDotNetAPIBaseURLString,POST];
    dispatch_async(dispatch_get_main_queue(), ^{
        [[MbprogressTool standard] showprogressHUD];
    });
    return [[AFAppDotNetAPIClient sharedClient] POST:post parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
        for (NSString *keyString in [picDic allKeys]){
            NSData *imgData = [picDic objectForKey:keyString];
            if (imgData.length > 0) {
                [formData appendPartWithFileData:imgData name:keyString fileName:[NSString stringWithFormat:@"%@%u.jpg", keyString,arc4random()%98] mimeType:@"image/jpeg"];
                DEBUGLog(@"图片上传%@",keyString);
            }
        }
    } progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        DEBUGLog(@"%@",parameters);
        NSAssert([responseObject isKindOfClass:[NSDictionary class]], @"JSON结构返回与约定不符");
        if (block) {
            block(responseObject, nil);
        }
        [[MbprogressTool standard] hiddenProgressHUD];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (block) {
            block(nil, error);
        }
        [[MbprogressTool standard] hiddenProgressHUD];
    }];
}

3.具体接口再次对通用接口进行封装(嫌麻烦的话直接用通用的也可以)

我这里是用对上面的通用接口类加不同的扩展实现的(下图也是我的整个网络部分结构)

接口逻辑.png

一个具体的实现例子

/*!
 *  查询收藏列表
 *
 *  @param currectPage 当前页面
 *  @param block       block description
 *
 *  @return return value description
 */
+(NSURLSessionDataTask*)getMyCollectListIsCurretPage:(NSInteger)currectPage ResultBlock:(void(^)(NSArray * model, NSString *failMessage))block;

+(NSURLSessionDataTask*) getMyCollectListIsCurretPage:(NSInteger)currectPage ResultBlock:(void(^)(NSArray * model, NSString *failMessage))block{
    NSDictionary * parma = @{@"userId":@"",
                             @"pageSize":@"10",
                             @"pageIndex":@(currectPage)};
    return [self normalHttpRequestWithParameters:parma POST:isBaby?MyCollectBabyListURL:MyCollectShowListURL resultBlock:^(NSDictionary *commentReturnModel, NSError *error) {
        if (!error){//成功是操作
            if ([[commentReturnModel objectForKey:@"status"] integerValue] == DEF_SUCESS_CODE){
                
                NSMutableArray * dataArr = [[NSMutableArray alloc]init];
                [commentReturnModel[@"data"][@"dataList"] enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    if (isBaby) {
                        MyCollectBabyModel * styleModel = [[MyCollectBabyModel alloc]initWithDictionary:obj];
                        [dataArr addObject:styleModel];
                    }else{
                        MyCollectShowBabyModel * styleModel = [[MyCollectShowBabyModel alloc]initWithDictionary:obj];
                        [dataArr addObject:styleModel];
                    }
                }];
                NSArray * model = [NSArray arrayWithArray:dataArr];
                if (block) {
                    block(model, nil);
                }
            }
            else{//失败时的操作
                if (block) {
                    block(nil, [commentReturnModel objectForKey:@"msg"]);
                }
            }
        }else{//错误时的操作
            if (block) {
                block(nil, @"网络请求失败");
            }
        }
    }];
}

上面就是我的AF的封装其中还有两个类说一下

1.NetRequestUrls 这里我是存放了所有的接口地址,这样方便统一管理,

2.MbprogressTool则是对于MB的一个封装

在上面通用方法的时候大家应该发现了我在开始请求的时候调用了一下,在结束是停止,这样就可以买一个请求都有MB了不用在所有地方都写。MbprogressTool具体实现如下:

.h接口文件

#import <Foundation/Foundation.h>

@interface MbprogressTool : NSObject
+(instancetype)standard;
-(void)showprogressHUD;
-(void)hiddenProgressHUD;
-(UIViewController *)getCurrentVC;
@end

.m实现文件

#import "MbprogressTool.h"
#import <MBProgressHUD.h>
#import <UIImage+GIF.h>

@interface MbprogressTool ()
@property (nonatomic, strong) MBProgressHUD *progressHUD;
@property (nonatomic, assign) NSInteger referenceCount;//引用mb的个数
@end

@implementation MbprogressTool
+(instancetype)standard{
    static MbprogressTool *mbprogressTool = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        mbprogressTool = [[MbprogressTool alloc] init];
        mbprogressTool.progressHUD = [[MBProgressHUD alloc]init];
        mbprogressTool.progressHUD.color = [UIColor clearColor];
        mbprogressTool.progressHUD.mode = MBProgressHUDModeCustomView;
        UIImageView * imageView = [[UIImageView alloc]initWithImage:[UIImage sd_animatedGIFNamed:@"刷新gif"]];
        imageView.layer.cornerRadius = 15;
        imageView.layer.masksToBounds = YES;
        imageView.alpha = 0.7;
        imageView.frame = CGRectMake(0, 0, 123/1.5, 123/1.5);
        mbprogressTool.progressHUD.customView = imageView;
        mbprogressTool.progressHUD.removeFromSuperViewOnHide = YES;
        //mbprogressTool.progressHUD.labelText=@"加载中...";
        //mbprogressTool.progressHUD.labelFont = DEF_STFont(14.0);
        
        mbprogressTool.referenceCount = 0;
    });
    return mbprogressTool;
}

-(void)showprogressHUD{
    _referenceCount++;
    if ([self getCurrentVC].navigationController != nil) {
        [[self getCurrentVC].navigationController.view addSubview:_progressHUD];
    }else{
        [[self getCurrentVC].view addSubview:_progressHUD];
    }
    [_progressHUD show:YES];
}

-(void)hiddenProgressHUD{
    _referenceCount--;
    if (_referenceCount == 0) {
        [_progressHUD hide:YES];
    }
//    [_progressHUD removeFromSuperview];
}

//获取当前屏幕显示的viewcontroller
-(UIViewController *)getCurrentVC
{
    UIViewController *result = nil;
    
    UIWindow * window = [[UIApplication sharedApplication] keyWindow];
    if (window.windowLevel != UIWindowLevelNormal){
        NSArray *windows = [[UIApplication sharedApplication] windows];
        for(UIWindow * tmpWin in windows){
            if (tmpWin.windowLevel == UIWindowLevelNormal){
                window = tmpWin;
                break;
            }
        }
    }
    
    UIView *View = [[window subviews] objectAtIndex:0];
    UIView *frontView = [[View subviews] lastObject];
    id nextResponder = [frontView nextResponder];
    
    if ([nextResponder isKindOfClass:[UIViewController class]]){
        result = nextResponder;
    }
    else{
        result = window.rootViewController;
    }
    return result;
}

@end

写完了,因为现在完成的这个项目就是用的这套东西所以使用起来应该没有问题,有什么问题可以问我,,,

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,421评论 25 707
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,858评论 6 13
  • 今天该写些什么呢?今天就说说在写作群里认识的杨子姐姐。 她整个人的精气神带给我很大的震撼。她的年纪应该到了五十知天...
    陈蓁蓁阅读 352评论 0 1
  • 末日来临的那天,人类在废墟中央砌上了高墙,大门外是成群的僵尸在游荡。不名火燃烧大大小小的车辆,我独自,独自地,生活...
    iankymic阅读 365评论 0 0