前言
實(shí)現(xiàn)思路
協(xié)議設(shè)定
補(bǔ)充
功能的優(yōu)缺點(diǎn)分析
小結(jié)
前言
當(dāng)我們處理接口數(shù)據(jù)的時(shí)候,有些情況僅僅需要獲取一個(gè)或多個(gè)字段,來進(jìn)行狀態(tài)判斷或數(shù)據(jù)顯示。在寫這部分代碼的時(shí)候,或多或少會(huì)有一種重復(fù)感,但它又不是一成不變的重復(fù),而是其模式相同,大量的字典取值操作,又或者多層的字典取值。這里能否實(shí)現(xiàn)一個(gè)功能,減少重復(fù)操作,一步到位,又或者提高下效率,讓這部分代碼邏輯變得簡(jiǎn)潔統(tǒng)一。我想可以自己定義一個(gè)取值協(xié)議,通過這個(gè)協(xié)議對(duì)數(shù)據(jù)進(jìn)行解析,獲取目的字段。這樣就方便多了,只要根據(jù)協(xié)議解析就就可以省去很多重復(fù)操作。
實(shí)現(xiàn)思路
獲取到后臺(tái)數(shù)據(jù)的時(shí)候,接口回調(diào)回來的是一個(gè)字典對(duì)象,如果不是,那么需要進(jìn)行一層處理轉(zhuǎn)換成字典對(duì)象。然后,我們只需要對(duì)這個(gè)字典對(duì)象一層一層的解析,直到獲取并返回目的字段的值。在解析的過程中,添加必要的健壯性處理,如果無法滿足下一步解析的條件,結(jié)束解析并返回錯(cuò)誤信息。
協(xié)議設(shè)定
傳入特定結(jié)構(gòu)的字符串作為解析的依據(jù)。而這個(gè)字符串的結(jié)構(gòu)規(guī)則就是協(xié)議的內(nèi)容。
1.把"{"作為字典類型的標(biāo)記
2.把"["作為數(shù)組類型的標(biāo)記
3.在"{"、"["前添加各自的字段名keyName
4.由左到右解析
例如:@"keyName0{KeyName1{dstKeyName{"
第一層字段名為keyName0,類型為字典,所以先解析出一個(gè)字典對(duì)象value0。通過value0和第二層字段名KeyName1,解析出一個(gè)value1。如此類推,通過value1獲取目的字段dstKeyName的值dstValue。
其正確的數(shù)據(jù)結(jié)構(gòu):
{
"keyName0":{
"KeyName1":{
"dstKeyName":{
//keys & values
}
}
}
}
補(bǔ)充
能獲取下一層的必須是一個(gè)字典對(duì)象,就是說協(xié)議字符串目的字段之前所有字段的類型標(biāo)記都為"{"。還有一點(diǎn),我們可以在目的字段后面添加類型標(biāo)記,這樣的話,就可以根據(jù)這個(gè)類型標(biāo)記來判斷目的字段的值的類型是否與期待的一致。可以添加NSString、NSNumber類型的符號(hào)如NSString對(duì)應(yīng)@,Number對(duì)應(yīng)$等,約定好添加邏輯處理即可。
測(cè)試代碼:
NSString *path = [[NSBundle mainBundle]pathForResource:@"json" ofType:@"txt"];
NSString *jsonString = [[NSString alloc]initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError = nil;
NSDictionary *testDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&jsonError];
if (jsonError) {
NSLog(@"error0:%@ ",jsonError);
return;
}
NSNumber *status = [SafeDataProcessor getObjectWithFormmateString:@"data{status" data:testDictionary];
//直接獲取page字段
NSNumber *page = [SafeDataProcessor getObjectWithFormmateString:@"data{result{all_page" data:testDictionary];
//先獲取result字段,再獲取list字段
NSDictionary *result = [SafeDataProcessor getObjectWithFormmateString:@"data{result{" data:testDictionary];
NSArray *list = [SafeDataProcessor getObjectWithFormmateString:@"list[" data:result];
NSLog(@"\n statu:%@,\n page:%@,\n list:%@,\n result:%@,\n ",status,page,list,result);
調(diào)試結(jié)果:
2018-02-22 10:57:25.093365+0800 SafeNetDataProcessor[2882:123596]
statu:200,
page:20,
list:(
{
"check_reply_info" = {
num = 6;
type = 1;
};
content = "\U5b66\U4e60\U4e0d\U662f\U7ed9\U8001\U5e08\U5b66\U7684\Uff0c\U662f\U7ed9\U4f60\U81ea\U5df1\U5b66\U7684\U3002";
"create_time" = 1518361773;
floor = 1;
groupid = "-1";
"light_count" = 1992;
pid = 259696;
puid = 25941704;
quote = (
);
"quote_deleted" = 0;
smallcontent = "\U5b66\U4e60\U4e0d\U662f\U7ed9...";
time = "8\U5c0f\U65f6\U524d";
togglecontent = "";
"update_info" = 0;
userImg = "http://i1.hoopchina.com.cn/user/665/256623943989665/256623943989665-1518360162.jpeg@45h_45w_2e";
userName = "\U4e8c\U53f7\U8001\U6d41\U6c13";
"user_banned" = 0;
via = 9;
},
功能的優(yōu)缺點(diǎn)分析
優(yōu)點(diǎn):這個(gè)功能的優(yōu)點(diǎn)很明顯,就是把分散的處理集中了,輸入結(jié)構(gòu)字符串和網(wǎng)絡(luò)返回值,即可獲取目的字段的值,中間的健壯性處理和取值操作都可以省掉了,從這個(gè)角度看,減少了編碼工作,提高了效率;同時(shí),統(tǒng)一的健壯性處理,只要保證內(nèi)部處理正確穩(wěn)定,那么該部分處理就是穩(wěn)定安全的。對(duì)比原來,每次都要手寫一次,難保每次都是正確的,特別拷貝大段代碼進(jìn)行修改,這樣的操作容易出現(xiàn)低級(jí)錯(cuò)誤。
缺點(diǎn):根據(jù)字符串來解析,所以會(huì)有額外的字符串操作處理,使程序的執(zhí)行效率變低。
小結(jié)
從程序運(yùn)行的角度來看,效率最高的的固然是最貼近需求,無多余操作的代碼。但從軟件開發(fā)的角度來看,程序本身執(zhí)行效率很重要,但是程序健壯性、編碼效率和編碼質(zhì)量也同樣重要。
demo地址:
https://github.com/zmubai/SafeDataProcessor
end~