iOS 網(wǎng)絡(luò)數(shù)據(jù)-取值探索

前言
實(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~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評(píng)論 19 139
  • 一、Java 簡(jiǎn)介 Java是由Sun Microsystems公司于1995年5月推出的Java面向?qū)ο蟪绦蛟O(shè)計(jì)...
    子非魚_t_閱讀 4,667評(píng)論 1 44
  • 點(diǎn)擊查看原文 Web SDK 開發(fā)手冊(cè) SDK 概述 網(wǎng)易云信 SDK 為 Web 應(yīng)用提供一個(gè)完善的 IM 系統(tǒng)...
    layjoy閱讀 14,516評(píng)論 0 15
  • 一、掛起 當(dāng)有電話進(jìn)來或者鎖屏,這時(shí)你的應(yīng)用程會(huì)掛起,在這時(shí),UIApplicationDelegate委托會(huì)收到...
    流刃若火泣閱讀 4,245評(píng)論 0 0

友情鏈接更多精彩內(nèi)容