在開發(fā)當(dāng)中,不免會遇到需要處理一些多值參數(shù)的情況毫胜,或者從后臺拿到的數(shù)據(jù)輸出中文的情況敌呈,接下來,我們詳細(xì)講解下颓哮,在開發(fā)中,遇到多值參數(shù)鸵荠,以及中文輸出冕茅,需要如何處理。
- 多值參數(shù)的正確處理方法
需求:如下圖蛹找,查看熱門城市的天氣預(yù)報(參數(shù)可多選)
// 首先姨伤,當(dāng)我點擊控制器的時候完成發(fā)送請求
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 01.確定請求URL
NSURL *url = [NSURL URLWithString:@""];
// 02.創(chuàng)建請求對象
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 03.發(fā)送請求
[NSURLConnection sendAsynchronousRequest:request queue:[[NSOperationQueue alloc] init] completionHandler:^(NSURLResponse * _Nullable response, NSData * _Nullable data, NSError * _Nullable connectionError) {
// 04.解析數(shù)據(jù)
// 先將數(shù)據(jù)打印成NSString類型先來看一下,
NSLog(@"%@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
}
得到的結(jié)果是這樣:
<b>注意:在01
處,確定請求URL的傳值</b>
// 正確傳值:http://120.25.226.186:32812/weather?place=Beijing&place=Guangzhou
// 錯誤傳值:http://120.25.226.186:32812/weather?place=Beijing&Guangzhou 系統(tǒng)會自動忽略掉后面Guangzhou
okay庸疾,繼續(xù)~~
在04
解析的時候乍楚,我們換一種方式解析:用JSON解析數(shù)據(jù)
// 04.解析JSON數(shù)據(jù)(注意:在開發(fā)中一般碰到的都是JSON數(shù)據(jù)解析)
// JSON --> OC對象
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
最終答應(yīng)結(jié)果:
注意:紅色現(xiàn)在我們的代碼還是存在一些問題的,在狀態(tài)欄届慈,我們得到的是一堆Unicode碼徒溪,如何將Unicode碼轉(zhuǎn)化為中文呢?(如何控制字典的輸出金顿,重寫系統(tǒng)的某個方法臊泌,覆蓋掉系統(tǒng)原有的方法 — 給字典添加分類)
// 創(chuàng)建字典分類-- VtcExport(控制字典輸出的分類)
// 重寫系統(tǒng)的方法控制輸出 (此方法控制程序中所有字典的輸出)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
//為了滿足我們的需求,即:在用到Unicode轉(zhuǎn)碼的時候來到該方法揍拆,
// 便利字典渠概,自己拼接字典中的key和value
// 自己拼接String
// 01.先創(chuàng)建可變String
NSMutableString *mutableString = [NSMutableString string];
// 02.從字典的最外層開始拼接
// 2.1拼接:{}
[mutableString appendString:@"{"];
// 2.2拼接 key --- value (通過self拿到字典)
/**
它就一個參數(shù)就是block,這個block攜帶了三個參數(shù)嫂拴,這將要把dictionary里面的key和value每次一組傳遞到block高氮,enumerateKeysAndObjectsUsingBlock會遍歷dictionary并把里面的key和value一組一組的展示給你慧妄,每組都會執(zhí)行這個block。這其實就是傳遞一個block到另一個方法剪芍,在這個例子里面它會帶著特定參數(shù)被反復(fù)調(diào)用塞淹,直到找到一個ENOUGH的key,然后就會通過重新賦值那個BOOL *stop來停止運行罪裹,停止遍歷同時停止調(diào)用block饱普。
@param key 字典的Key
@param obj 字典的Value
@param stop 停止便利
*/
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[mutableString appendFormat:@"%@:", key];
[mutableString appendFormat:@"%@,", obj];
}];
[mutableString appendString:@"}"];
//刪除逗號
// options:NSBackwardsSearch 從后往前的模式去搜索
NSRange range = [mutableString rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[mutableString deleteCharactersInRange:range];
}
return mutableString;
}
重寫字典的descriptionWithLocale方法之后,我們得到:
似乎跟我們平時見到的字典樣式還不一樣状共,
( )
在OC對象中代表數(shù)組套耕,所以我們還需要從寫NSArray的某個方法(descriptionWithLocale)
// 創(chuàng)建數(shù)組的分類-- VtcExport(控制數(shù)組輸出的分類)
// 重寫系統(tǒng)的方法控制輸出 (此方法控制程序中所有字典的輸出)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
// 自己拼接String
// 01.先創(chuàng)建可變String
NSMutableString *mutableString = [NSMutableString string];
// 02.從數(shù)組的最外層開始拼接
[mutableString appendString:@"["];
// 2.2拼接 key --- value (通過self拿到字典)
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[mutableString appendFormat:@"%@,\n", obj];
}];
[mutableString appendString:@"]"];
//刪除逗號
// options:NSBackwardsSearch 從后往前的模式去搜索
NSRange range = [mutableString rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[mutableString deleteCharactersInRange:range];
}
return mutableString;
}
最終,我們得到的效果是:
<b>注意:由于是重寫的系統(tǒng)的方法峡继,所以在使用的時候不需要包含分類的頭文件冯袍,那我們可以簡化一下代碼,將我們重寫的系統(tǒng)方法放在一個文件里面/同樣也是可以的</b>
// 創(chuàng)建分類—Foundation+VtcExport.m
#import <Foundation/Foundation.h>
@implementation NSDictionary (VtcExport)
// 重寫系統(tǒng)的方法控制輸出 (此方法控制程序中所有字典的輸出)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
//為了滿足我們的需求碾牌,即:在用到Unicode轉(zhuǎn)碼的時候來到該方法康愤,
// 便利字典,自己拼接字典中的key和value
// 自己拼接String
// 01.先創(chuàng)建可變String
NSMutableString *mutableString = [NSMutableString string];
// 02.從字典的最外層開始拼接
// 2.1拼接:{}
[mutableString appendString:@"{"];
// 2.2拼接 key --- value (通過self拿到字典)
/**
它就一個參數(shù)就是block舶吗,這個block攜帶了三個參數(shù)征冷,這將要把dictionary里面的key和value每次一組傳遞到block,enumerateKeysAndObjectsUsingBlock會遍歷dictionary并把里面的key和value一組一組的展示給你誓琼,每組都會執(zhí)行這個block检激。這其實就是傳遞一個block到另一個方法,在這個例子里面它會帶著特定參數(shù)被反復(fù)調(diào)用腹侣,直到找到一個ENOUGH的key叔收,然后就會通過重新賦值那個BOOL *stop來停止運行,停止遍歷同時停止調(diào)用block傲隶。
@param key 字典的Key
@param obj 字典的Value
@param stop 停止便利
*/
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[mutableString appendFormat:@"%@:", key];
[mutableString appendFormat:@"%@,", obj];
}];
[mutableString appendString:@"}"];
//刪除逗號
// options:NSBackwardsSearch 從后往前的模式去搜索
NSRange range = [mutableString rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[mutableString deleteCharactersInRange:range];
}
return mutableString;
}
@end
@implementation NSArray (VtcExport)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
// 自己拼接String
// 01.先創(chuàng)建可變String
NSMutableString *mutableString = [NSMutableString string];
// 02.從數(shù)組的最外層開始拼接
// 2.1拼接:[ ]
[mutableString appendString:@"["];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
[mutableString appendFormat:@"%@,\n", obj];
}];
[mutableString appendString:@"]"];
//刪除逗號
// options:NSBackwardsSearch 從后往前的模式去搜索
NSRange range = [mutableString rangeOfString:@"," options:NSBackwardsSearch];
if (range.location != NSNotFound) {
[mutableString deleteCharactersInRange:range];
}
return mutableString;
}
好了今穿,下次遇到如上問題,拷貝就可以了~