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