iOS 網(wǎng)絡(luò)數(shù)據(jù)處理技巧涣旨,提高程序健壯性

前言
網(wǎng)絡(luò)數(shù)據(jù)健壯性處理
  逐層判斷
  字段類型判斷
  非空判斷
  單個字段邏輯合法性判斷
  字段間邏輯合法性判斷
小結(jié)

前言

作為一名移動開發(fā)者,免不了跟網(wǎng)絡(luò)數(shù)據(jù)打交道股冗。在需求開發(fā)的過程中霹陡,我們會通過接口文檔約定好前后端交互的數(shù)據(jù)結(jié)構(gòu),基于這個,我們能順利地實現(xiàn)前端的數(shù)據(jù)交互烹棉,順利的把數(shù)據(jù)送往后臺攒霹。如果我們嚴(yán)格遵守雙方約定,就可以大大的減少數(shù)據(jù)問題浆洗。但是催束,數(shù)據(jù)這東西無法保證百分百準(zhǔn)確,為了避免數(shù)據(jù)錯誤導(dǎo)致更大的程序錯誤辅髓,我們必須對數(shù)據(jù)做嚴(yán)格校驗泣崩,從而保證程序的健壯性。

/*
//示例數(shù)據(jù)結(jié)構(gòu):
{
    "data":{
        "status":200,
        "result":{
            "list":Array[20],
            "all_page":20
        }
    },
    "status":0
}
*/

網(wǎng)絡(luò)數(shù)據(jù)健壯性處理

逐層判斷

從外到里一層一層的判斷洛口,確保每一步操作成功了才進(jìn)行下一步操作矫付。

+ (NSDictionary *)resultWithResponseDictionary:(NSDictionary*)responseDictionary
{
    NSAssert([responseDictionary isKindOfClass:[NSDictionary class]], @"responseDictionary should be dictionary class");
    
    if (![responseDictionary isKindOfClass:[NSDictionary class]]) return nil;
    
    NSDictionary *data = [responseDictionary valueForKey:@"data"];
    if (![data isKindOfClass:[NSDictionary class]])  return nil;
    
    NSDictionary *result = [data valueForKey:@"result"];
    if (![result isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    else
    {
        return result;
    }
}

+ (NSArray *)getListWithResponseDictionary:(NSDictionary*)responseDictionary
{
    NSDictionary *result = [self resultWithResponseDictionary:responseDictionary];
    
    NSArray *list  = [result valueForKey:@"list"];
    
    return [list isKindOfClass:[NSArray class]]?list:nil;
}
字段類型判斷

因為OC是動態(tài)語言,對象的真實類型在運(yùn)行的時候才能確定第焰,如果不添加類型判斷买优,在網(wǎng)絡(luò)數(shù)據(jù)處理的場景下,可能會出現(xiàn)對象真實類型與期待類型不一致的情況挺举,導(dǎo)致方法調(diào)用失敗杀赢,程序異常崩潰。例如湘纵,預(yù)期的是一個NSString對象脂崔,調(diào)用了NSString類獨(dú)有的substringFromIndex方法,運(yùn)行的時候卻是一個NSNumber對象梧喷,繼續(xù)調(diào)用substringFromIndex方法砌左,就會產(chǎn)生一個運(yùn)行時崩潰。另一種情況铺敌,調(diào)用的是共同父類的方法 汇歹,NSNumber對象執(zhí)行方法不會發(fā)生異常,但這時程序已經(jīng)存在風(fēng)險了偿凭,因為對象類型已經(jīng)不符程序預(yù)期产弹。可通過- (BOOL)isKindOfClass:(Class)aClass對類型進(jìn)行判斷弯囊。

非空判斷

空對象調(diào)用方法是不會產(chǎn)生異常的痰哨,而操作空對象就可能出現(xiàn)異常,例如數(shù)組操作匾嘱、字典操作等作谭。如:

//測試代碼
 NSMutableDictionary *dic = @{}.mutableCopy;
    [dic setObject:nil forKey:@"age"];

異常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSDictionaryM setObject:forKey:]: object cannot be nil (key: age)'

//測試代碼
  [@[].mutableCopy addObject:nil];

異常:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

為了避免類似的問題,需要在操作對象前添加必要的非空判斷奄毡。

單個字段邏輯合法性判斷

對于一些有意義的字段折欠,這些字段有其合法的取值區(qū)間,那么操作該數(shù)據(jù)時需要先判斷其數(shù)據(jù)是否合法,例如:年齡age锐秦, 其合法性校驗age>0 咪奖。

字段間邏輯合法性判斷

有一些字段之間存在邏輯關(guān)系,特別是提交數(shù)據(jù)給后臺的時候酱床,我們更需要在提交之前做一次數(shù)據(jù)間邏輯合法性的校驗羊赵。如 x、y扇谣、z字段之間有如下關(guān)系:z = 2x + y昧捷。那么提交數(shù)據(jù)前就需要判斷下其是否符邏輯z = 2x + y。

小結(jié)

1罐寨、2靡挥、3點在網(wǎng)絡(luò)數(shù)據(jù)處理中是非常有必要的,而4鸯绿、5點加強(qiáng)了對數(shù)據(jù)邏輯的校驗跋破,更加貼近業(yè)務(wù)。同時瓶蝴,4毒返、5點一般采取斷言的方式進(jìn)行處理。在開發(fā)測試的過程中舷手,如果存在問題拧簸,我們期待通過斷言及時發(fā)現(xiàn)問題。

end~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末男窟,一起剝皮案震驚了整個濱河市盆赤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蝎宇,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷安,死亡現(xiàn)場離奇詭異姥芥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)汇鞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門凉唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人霍骄,你說我怎么就攤上這事台囱。” “怎么了读整?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵簿训,是天一觀的道長。 經(jīng)常有香客問我,道長强品,這世上最難降的妖魔是什么膘侮? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮的榛,結(jié)果婚禮上琼了,老公的妹妹穿的比我還像新娘。我一直安慰自己夫晌,他們只是感情好雕薪,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晓淀,像睡著了一般所袁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上要糊,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天纲熏,我揣著相機(jī)與錄音,去河邊找鬼锄俄。 笑死局劲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奶赠。 我是一名探鬼主播鱼填,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼毅戈!你這毒婦竟也來了苹丸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤苇经,失蹤者是張志新(化名)和其女友劉穎赘理,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扇单,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡商模,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蜘澜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片施流。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鄙信,靈堂內(nèi)的尸體忽然破棺而出瞪醋,到底是詐尸還是另有隱情,我是刑警寧澤装诡,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布银受,位于F島的核電站践盼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蚓土。R本人自食惡果不足惜宏侍,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜀漆。 院中可真熱鬧谅河,春花似錦、人聲如沸确丢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲜侥。三九已至褂始,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間描函,已是汗流浹背崎苗。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留舀寓,地道東北人胆数。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像互墓,于是被迫代替她去往敵國和親必尼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容