对于第三方库的封装
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
XWJsonToCode