iOS常用方法——基于AFNetworking的post、get方法的封装及获取当前网络状态的实现

AFNetworking是一个常用的网络请求库,每个项目的网络请求和返回格式不同,AFNetworking返回的通用型的,我们可以封装一层,让其更适合我们自己的项目。
实现代码:

#import <Foundation/Foundation.h>
typedef void (^RequestCompleteBlock)(id response);
typedef void (^RequestErrorBlock)(NSError *error);

@interface BZHttpRequestHelper : NSObject


/**
 post请求

 @param url 接口地址
 @param params 入参
 @param completeBlock 成功回调
 @param errorBlock 失败回调
 */
+(void)postWithUrl:(NSString *)url
         params:(NSDictionary *)params
          complete:(RequestCompleteBlock)completeBlock
             error:(RequestErrorBlock)errorBlock;



/**
 get请求

 @param url 接口地址
 @param params 入参
 @param completeBlock 成功回调
 @param errorBlock 失败回调
 */
+(void)getWithUrl:(NSString *)url
         params:(NSDictionary *)params
         complete:(RequestCompleteBlock)completeBlock
            error:(RequestErrorBlock)errorBlock;

@end
#import "BZHttpRequestHelper.h"
#import "AFNetworking.h"
//根据服务器返回的格式定义的基础返回模型
#import "BZHttpResponse.h"
//网络状态判断
#import "BZNetworkStatusManager.h"

@implementation BZHttpRequestHelper

+(AFHTTPSessionManager *)shareHttpSessionManager{
    static AFHTTPSessionManager * manager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        manager = [AFHTTPSessionManager manager];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        manager.responseSerializer = [AFJSONResponseSerializer serializer];
        manager.requestSerializer.timeoutInterval = 30;
    });
    return manager;
}

+(void)postWithUrl:(NSString *)url params:(NSDictionary *)params complete:(RequestCompleteBlock)completeBlock error:(RequestErrorBlock)errorBlock{
    //判断当前网络状态,如果是无网络状态可直接提示用户,且放弃网络请求
    if (![BZNetworkStatusManager shareNetworkStatusManagerInstance].isNetworkAvailable) {
        [BZHttpRequestHelper showNetworkUnavailable];
        return;
    }
    [[BZHttpRequestHelper shareHttpSessionManager] POST:url parameters:params progress:^(NSProgress * _Nonnull uploadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        //拿到返回数据后做相应的处理,下面的是根据服务器定义的一些错误码来判断请求是否成功返回
        BZHttpResponse * responseModel = [[BZHttpResponse alloc] init];
        NSError * error;
        if ([responseObject isKindOfClass:[NSDictionary class]]) {
            [responseModel setValuesForKeysWithDictionary:responseObject];
            if (responseModel.code == 0) {
                if (completeBlock) {
                    if (responseModel.data) {
                        completeBlock(responseModel.data);
                    }else{
                        completeBlock(responseModel);
                    }

                }
            }else{
                if (responseModel.code  == 7) {
                    //token失效,退出登录
                    [[NSNotificationCenter defaultCenter] postNotificationName:CURRENT_USER_KICKOUT object:nil];
                }else{
                    error = [NSError errorWithDomain:responseModel.message code:responseModel.code userInfo:nil];
                }
                if (errorBlock) {
                    errorBlock(error);
                }
            }
        }else{
            error = [NSError errorWithDomain:@"服务器数据结构错误" code:-100 userInfo:nil];
            if (errorBlock) {
                errorBlock(error);
            }
        }

    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        NSLog(@"error == %@",error);
        if (errorBlock) {
            errorBlock(error);
        }
    }];
}

+(void)getWithUrl:(NSString *)url params:(NSDictionary *)params complete:(RequestCompleteBlock)completeBlock error:(RequestErrorBlock)errorBlock{
    if (![BZNetworkStatusManager shareNetworkStatusManagerInstance].isNetworkAvailable) {
        [BZHttpRequestHelper showNetworkUnavailable];
        return;
    }
    [[BZHttpRequestHelper shareHttpSessionManager] GET:url parameters:params progress:^(NSProgress * _Nonnull downloadProgress) {

    } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        if (completeBlock) {
            completeBlock(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if (errorBlock) {
            errorBlock(error);
        }
    }];
}

+(void)showNetworkUnavailable{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIWindow * window = [[[UIApplication sharedApplication] delegate] window];
        [window makeToast:@"当前网络不可用,请检查网络稍后再试" duration:1.5 position:CSToastPositionBottom];
    });
}

@end

获取当前网络状态:

#import <Foundation/Foundation.h>

@interface BZNetworkStatusManager : NSObject

+(instancetype)shareNetworkStatusManagerInstance;
@property(nonatomic,assign) BOOL isNetworkAvailable;

@end
#import "BZNetworkStatusManager.h"
#import "AFNetworking.h"

@implementation BZNetworkStatusManager

+(instancetype)shareNetworkStatusManagerInstance{
    static BZNetworkStatusManager * manager = nil;
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{
        manager = [[BZNetworkStatusManager alloc] init];
    });
    return manager;
}

-(instancetype)init{
    self = [super init];
    if (self) {
        [self monitorNetworking];
    }
    return self;
}

-(void)monitorNetworking{
    [[AFNetworkReachabilityManager sharedManager] startMonitoring];
    [[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
        switch (status) {
            case -1:
                NSLog(@"未知网络");
                break;
            case 0:
                NSLog(@"网络不可达");
                break;
            case 1:
                NSLog(@"GPRS网络");
                break;
            case 2:
                NSLog(@"wifi网络");
                break;
            default:
                break;
        }
        if (status == AFNetworkReachabilityStatusReachableViaWWAN || status == AFNetworkReachabilityStatusReachableViaWiFi) {
            NSLog(@"有网");
            self.isNetworkAvailable = YES;
        }else{
            NSLog(@"没网");
            self.isNetworkAvailable = NO;
        }
    }];
}

@end

猜你喜欢

转载自blog.csdn.net/aaaaazq/article/details/80763799