對(duì)于第三方庫(kù)的封裝
MJExtension
AFNetworking
使用Category進(jìn)行封裝
唯一要注意的地方
JSON解析插件
ESJsonFormat
XWJsonToCode
對(duì)于第三方庫(kù)的封裝
對(duì)于第三方類庫(kù)的使用,盡量使用Category進(jìn)行封裝,讓第三方類庫(kù)只暴露一個(gè)接口給程序代碼。
以盡量減少第三方代碼對(duì)于程序的侵染性為主要原則。
這樣可以防止切換第三方框架時(shí),而導(dǎo)致的諸多不便。
MJExtension
關(guān)于解析操作,在github上有很多成熟的框架可供選擇。例如Mantle,JSONModel等。 這兩個(gè)框架出現(xiàn)的較早。
MJExtension是中國(guó)人編寫的MJExtension,是最近在國(guó)內(nèi)最流行的解析框架。
吸取了前兩款框架的優(yōu)點(diǎn)并進(jìn)行了改進(jìn), 官方文檔是中文的,同學(xué)們自己查看。
#import"MJExtension.h"
/*
1.MJ對(duì)于JSON數(shù)據(jù)的根類型是數(shù)組或者字典,有不同的解析方法
2.原則上,要盡量減少第三方框架對(duì)于源碼的侵染,應(yīng)該只留一個(gè)接口,這樣可以預(yù)防需求變更時(shí)的大批量改動(dòng)
*/
@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排名第一的網(wǎng)絡(luò)請(qǐng)求框架。 多線程操作由NSOperation負(fù)責(zé), 網(wǎng)絡(luò)操作由NSURLSession負(fù)責(zé)。AFNetworking
官方文檔雖然是英文的, 但是簡(jiǎn)單易懂, 都是干貨。
使用Category進(jìn)行封裝
#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];
//設(shè)置允許相應(yīng)的內(nèi)容類型
#warning 如果沒寫, 可能會(huì)出現(xiàn)錯(cuò)誤打印 unacceptable contentType: ....
manager.responseSerializer.acceptableContentTypes= [NSSetsetWithArray:@[@"text/html",@"text/plain",@"text/json",@"text/javascript",@"application/json"]];
//請(qǐng)求超時(shí)時(shí)間(默認(rèn)60秒),請(qǐng)求緩存策略
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"]];
//請(qǐng)求超時(shí)時(shí)間(默認(rèn)60秒),請(qǐng)求緩存策略
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
唯一要注意的地方
需要對(duì)AF的接受內(nèi)容類型進(jìn)行設(shè)置,AF默認(rèn)只能支持application/json內(nèi)容模式
manager.responseSerializer.acceptableContentTypes = [NSSetsetWithArray:@[@"text/html", @"text/plain", @"text/json", @"text/javascript", @"application/json"]];
JSON解析插件
兩款插件都是中國(guó)人寫的, 官方文檔是中文的, 自己點(diǎn)擊鏈接查看。
ESJsonFormat
XWJsonToCode