iOS--简单封装AFNetworking(二)

##写在前面
由于本人在工作中经常会进行网络请求,实在是不想一直写那段请求代码,就自己封装了一个LiynNet类。其中使用代理完成方法回调。

这里面涉及到了GET/POST方法。
废话不多说直接上代码

##下面是.h文件的内容:
代理回调协议方法

@protocol LiynNetDelegate 
- (void)netFinsh:(id)object;
- (void)netError:(id)errorMsg;
@end

这里只有一个属性delegate,用于建立代理关系;
这里向外暴露了五个方法,其中第一个类方法用来初始化一个网络请求类的实例化对象,这个对象是一个单例对象,因为网络请求对象,不存储数据,只作为一个单纯的工具类,所以这个对象只需要存在一个就可以。


@interface LiynNet : NSObject
@property (nonatomic, weak) id delegate;
#pragma mark: method
+ (LiynNet *)defaultNet;
- (void)uploadPOST:(NSString *)URLString Parameters:(id)parameters UploadDictionary:(NSDictionary*)uploadInfo;
- (void)POST:(NSString *)URLString Parameters:(id)parameters;
- (void)GET:(NSString *)URLString Parameters:(id)parameters;
- (void)GETPic:(NSString *)URLString Parameters:(id)parameters Path:(NSString *)path;
@end

##下面是.m文件的内容

创建单例对象

+(LiynNet *)defaultNet{
    static LiynNet *net = nil;
    if (net == nil) {
        net = [[LiynNet alloc] init];
        net.manager = [AFHTTPSessionManager manager];
        net.manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    }
    return net;
}

##以下是网络请求
在这里我就想了定制,因为有时候需要判断返回数据的类型,例如:当一个页面进行多种数据请求时,代理方法只有一个,那么我们就需要一个标记变量来区别这次返回的数据类型是什么。
所以这里的parameters字典里需要一个字段msgType来区别。
###一般POST下载请求

- (void)POST:(NSString *)URLString Parameters:(id)parameters{
    NSString *msgType = parameters[@"msgType"];
    NSLog(@"{\nmethod:POST \nURL:%@  \nParameters:%@",URLString,parameters);
    [self.manager POST:URLString parameters:parameters[@"msg"] progress:^(NSProgress * _Nonnull uploadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [self success:@{@"msgType":msgType,@"msg":responseObject}];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [self failure:@{@"msgType":msgType,@"error":error}];
    }];
}

###一般的GET下载请求

- (void)GET:(NSString *)URLString Parameters:(id)parameters{
    NSString *msgType = parameters[@"msgType"];
    NSLog(@"method:GET URL:%@  Parameters:%@",URLString,parameters);
    [self.manager GET:URLString parameters:parameters progress:^(NSProgress * _Nonnull downloadProgress) {
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        [self success:responseObject];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [self failure:@{@"msgType":msgType,@"error":error}];
    }];
}

###一般的POST上传请求
注意上传的字段是服务器给定的,传入的字典uploadInfo内@"uploadParameter"对应的值。

- (void)uploadPOST:(NSString *)URLString Parameters:(id)parameters UploadDictionary:(NSDictionary*)uploadInfo{
    NSString *msgType = parameters[@"msgType"];
    NSLog(@"{\nmethod:POST \nURL:%@  \nParametersCid:%@",URLString,parameters[@"msg"]);
    NSDictionary *dict = parameters[@"msg"];
    [self.manager POST: URLString parameters:dict constructingBodyWithBlock:^(id  _Nonnull formData) {
        NSData *rightData = UIImageJPEGRepresentation(uploadInfo[@"image"], 0.7);
        [formData appendPartWithFileData:rightData
                                    name: uploadInfo[@"uploadParameter"]
                                fileName:@"IDRight.png"
                                mimeType:@"image/jpeg"];
    } progress:^(NSProgress * _Nonnull uploadProgress) {
        
        NSLog(@"%f",1.0 * uploadProgress.completedUnitCount/uploadProgress.totalUnitCount);
        
    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:responseObject
                                                             options:NSJSONReadingMutableContainers
                                                               error:nil];
        [self success:@{@"msgType":msgType,@"msg":dict}];
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        [self failure:@{@"msgType":msgType,@"error":error}];
    }];
}

###两个私有方法

####请求数据成功

- (void)success:(id)responseObject{
    if (_delegate && [_delegate respondsToSelector:@selector(netFinsh:)]) {
        [_delegate netFinsh:responseObject];
    }
}

####请求数据失败

- (void)failure:(id)error{
    if (_delegate && [_delegate respondsToSelector:@selector(netError:)]) {
        [_delegate netError:error];
    }
}

这个类是基于AFNetworking的,所以在使用的时候必须要先倒入AFNetworking的第三方库,建议使用CocoaPods来导入,如果有人不会使用的可以自行百度。

pod 'AFNetworking', '~> 3.1.0'

首先在使用的类里遵循协议


声明一个全局的LiynNet类的对象(这个全局只是建议 不全局也可以)

{
	LiynNet *_net;
}

或者定义一个属性

@property (nonatomic, strong) LiynNet *net;

实例化这个LiynNet对象并建立代理关系

#pragma mark - 懒加载
-(LiynNet *)net{
    if (_net == nil) {
        _net = [LiynNet defaultNet];
        _net.delegate = self;
    }
    return  _net;
}

###实现协议的方法
在这里你就可以操作返回的数据了

- (void)netFinsh:(id)object{
    NSLog(@"msgType %@\n msg %@",object[@"msgType"],object[@"msg"]);
}

这里你就需要慢慢查找原因了

- (void)netError:(id)errorMsg{
    NSLog(@"msgType %@\n msg %@", errorMsg[@"msgType"], errorMsg[@"msg"]);
}

你可能感兴趣的:(iOS,网络,AFN,iOS)