Contents
  1. 1. 1.封装网络请求工具类

1.封装网络请求工具类

`XYNetManager.h文件中`
#import <Foundation/Foundation.h>

#define kCompletionHandle completionHandle:(void(^)(id model, NSError *error))completionHandle;

@interface XYNetManager : NSObject

/** 对AFHTTPSessionManager的GET请求方法进行了封装 */
+ (id)GET:(NSString *)path parameters:(NSDictionary *)params completionHandler:    (void(^)(id responseObj, NSError *error))complete;

/** 对AFHTTPSessionManager的POST请求方法进行了封装 */
+ (id)POST:(NSString *)path parameters:(NSDictionary *)params completionHandler:    (void(^)(id responseObj, NSError *error))complete;

/**
 *  为了应付某些服务器对于中文字符串不支持的情况,需要转化字符串为带有%号形势
 *
 *  @param path   请求的路径,即 ? 前面部分
 *  @param params 请求的参数,即 ? 号后面部分
 *
 *  @return 转化 路径+参数 拼接出的字符串中的中文为 % 号形势
 */
+ (NSString *)percentPathWithPath:(NSString *)path params:(NSDictionary *)params;
@end


`XYNetManager.m文件中`
#import "XYNetManager.h"


static AFHTTPSessionManager *manager = nil;

@implementation XYNetManager

+ (AFHTTPSessionManager *)sharedAFManager{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
            manager = [AFHTTPSessionManager manager];
        // 此处添加了 @"text/plain"   这样才能够解析
        manager.responseSerializer.acceptableContentTypes = [NSSet     setWithObjects:@"text/html", @"application/json", @"text/json", @"text/javascript",     @"text/plain", nil];
    });
    return manager;
}

//http://cache.tuwan.com/app/?appid=1&class=heronews&mod=八卦&appid=1&appver=2.1
/* URL的结构是 ? 号之前是地址, ?号之后是参数
 path:http://cache.tuwan.com/app/
 params:@{@"appid":@1, @"class":@"heronews", @"mod":@"八卦", @"appver":@2.1}
 */
//方法:把path和参数拼接起来,把字符串中的中文转换为 百分号 形势,因为有的服务器不接收中文编码
+ (NSString *)percentPathWithPath:(NSString *)path params:(NSDictionary *)params{
    NSMutableString *percentPath =[NSMutableString stringWithString:path];
    NSArray *keys = params.allKeys;
    NSInteger count = keys.count;
    /*  习惯
     for(int i = 0; i < params.allKeys.count; i ++)
     假设for循环循环1000次,params.allKeys实际上调用的[params allKeys], 会调用allKeys1000    次。 OC语言特性是runtime,实际上我们调用一个方法,底层操作是有两个列有方法的列表,常用表和总列表。    CPU先在常用表中搜索调用的方法指针,如果找不到,再到总列表中搜索。 在总列表中搜索你调用的方法所在的地    址,然后调用完毕之后把这个方法名转移到常用方法列表。如果再次执行某个方法就在常用方法列表中搜索调用,    效率更高。但是毕竟每次搜索方法都是耗时的,而swift语言则没有运行时,即没有这个搜索过程。 这是swift比    oc效率高20%的原因。 为了避免搜索耗时,我们在for循环外部就把调用次数算出来,这样每次for循环只需要去    count所在地址读变量值即可。 这样for循环效率更高。
     */
    for (int i = 0; i < count; i++) {
        if (i == 0) {
            [percentPath appendFormat:@"?%@=%@", keys[i], params[keys[i]]];
        }else{
            [percentPath appendFormat:@"&%@=%@", keys[i], params[keys[i]]];
        }
    }
    //把字符串中的中文转为%号形势
    return [percentPath     stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
}

+ (id)GET:(NSString *)path parameters:(NSDictionary *)params completionHandler:    (void(^)(id responseObj, NSError *error))complete{

    return [[self sharedAFManager] GET:path parameters:params progress:nil     success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        complete(responseObject, nil);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        complete(nil, error);
    }];
}

+ (id)POST:(NSString *)path parameters:(NSDictionary *)params completionHandler:    (void(^)(id responseObj, NSError *error))complete{

    return [[self sharedAFManager] POST:path parameters:params progress:nil     success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {

        complete(responseObject, nil);
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {

        complete(nil, error);
    }];
}

@end
Contents
  1. 1. 1.封装网络请求工具类