框架的封装

对于第三方库的封装

MJExtension

AFNetworking

使用Category进行封装

唯一要注意的地方

JSON解析插件

ESJsonFormat

XWJsonToCode

对于第三方库的封装

对于第三方类库的使用,尽量使用Category进行封装,让第三方类库只暴露一个接口给程序代码。

以尽量减少第三方代码对于程序的侵染性为主要原则。

这样可以防止切换第三方框架时,而导致的诸多不便。

MJExtension

关于解析操作,在github上有很多成熟的框架可供选择。例如Mantle,JSONModel等。 这两个框架出现的较早。

MJExtension是中国人编写的MJExtension,是最近在国内最流行的解析框架。

吸取了前两款框架的优点并进行了改进, 官方文档是中文的,同学们自己查看。

#import"MJExtension.h"

/*

1.MJ对于JSON数据的根类型是数组或者字典,有不同的解析方法

2.原则上,要尽量减少第三方框架对于源码的侵染,应该只留一个接口,这样可以预防需求变更时的大批量改动

*/

@interfaceNSObject(MJExtension)

+ (id)parse:(id)responseObj;

@end

@implementationNSObject(MJExtension)

+ (id)parse:(id)responseObj{

if([responseObj isKindOfClass:[NSArrayclass]]) {

return[selfmj_objectArrayWithKeyValuesArray:responseObj];

}

if([responseObj isKindOfClass:[NSDictionaryclass]]) {

return[selfmj_objectWithKeyValues:responseObj];

}

returnresponseObj;

}

@end

AFNetworking

Github排名第一的网络请求框架。 多线程操作由NSOperation负责, 网络操作由NSURLSession负责。AFNetworking

官方文档虽然是英文的, 但是简单易懂, 都是干货。

使用Category进行封装

#import"AFNetworking.h"

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

@interfaceNSObject(AFNetworking)

+ (id)GET:(NSString*)path parameters:(id)parameters progress:(void(^)(NSProgress*downloadProgress))downloadProgress completionHandle:(void(^)(idresponseObj,NSError*error))completionHandle;;;

+ (id)POST:(NSString*)path parameters:(id)parameters progress:(void(^)(NSProgress*downloadProgress))downloadProgress completionHandle:(void(^)(idresponseObj,NSError*error))completionHandle;

@end

#import"NSObject+AFNetworking.h"

@implementationNSObject(AFNetworking)

+ (id)GET:(NSString*)path parameters:(id)parameters progress:(void(^)(NSProgress*))downloadProgress completionHandle:(void(^)(id,NSError*))completionHandle{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

//设置允许相应的内容类型

#warning 如果没写, 可能会出现错误打印 unacceptable contentType: ....

manager.responseSerializer.acceptableContentTypes= [NSSetsetWithArray:@[@"text/html",@"text/plain",@"text/json",@"text/javascript",@"application/json"]];

//请求超时时间(默认60秒),请求缓存策略

manager.requestSerializer.timeoutInterval=30;

//manager.requestSerializer.cachePolicy = 0;

return[manager GET:path parameters:parameters progress:downloadProgress success:^(NSURLSessionDataTask* _Nonnull task,id_Nullable responseObject) {

completionHandle(responseObject,nil);

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

completionHandle(nil, error);

NSLog(@"error %@", error);

}];

}

+ (id)POST:(NSString*)path parameters:(id)parameters progress:(void(^)(NSProgress*))downloadProgress completionHandle:(void(^)(id,NSError*))completionHandle{

AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

manager.responseSerializer.acceptableContentTypes= [NSSetsetWithArray:@[@"text/html",@"text/plain",@"text/json",@"text/javascript",@"application/json"]];

//请求超时时间(默认60秒),请求缓存策略

manager.requestSerializer.timeoutInterval=30;

//manager.requestSerializer.cachePolicy = 0;

return[manager POST:path parameters:parameters progress:downloadProgress success:^(NSURLSessionDataTask* _Nonnull task,id_Nullable responseObject) {

completionHandle(responseObject,nil);

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

completionHandle(nil, error);

NSLog(@"error %@", error);

}];

}

@end

唯一要注意的地方

需要对AF的接受内容类型进行设置,AF默认只能支持application/json内容模式

manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"text/html", @"text/plain", @"text/json", @"text/javascript", @"application/json"]];

JSON解析插件

两款插件都是中国人写的, 官方文档是中文的, 自己点击链接查看。

ESJsonFormat

ESJsonFormat

XWJsonToCode

XWJsonToCode

你可能感兴趣的:(框架的封装)