亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS開發中使用writeToFile時的注意事項

2020-07-26 02:54:41
字體:
來源:轉載
供稿:網友

總會有一些坑在前面等著你

我們先來看一下后臺返回的部分json數據,稍后再來分析問題,仔細看一下userId和userCode兩個字段,其他不用看

"list": [{   "classId": 5000285,   "className": "考勤(A)班",   "schoolId": 50011,   "schoolName": "星星局測中學25",   "classLeaderUserId": 2000163,   "parentList": [{    "userId": 2000790,    "userName": "zhaomin",    "gender": "0",    "mobile": "15071362222",    "email": "",    "areaCode": "440105",    "avatarUrl": "",    "userCode": "2000790",    "id": 1542,    "roleType": 2,    "nickName": "zhaomin"   }, {    "userId": 2000846,    "userName": "劉玄德",    "gender": "1",    "mobile": "18825113388",    "email": "",    "areaCode": "440105",    "avatarUrl": "",    "userCode": "2000846",    "id": 1631,    "roleType": 2,    "nickName": "劉玄德"   }],

問題背景

這個問題是在我集成環信IM的時候,由于需要處理用戶頭像和昵稱問題,所以會將聯系人的頭像url和用戶昵稱做一個本地緩存,緩存的方式就是采用簡單的寫入plist文件來處理.之所以使用plist,是因為簡單方便,而且可以滿足開發,所以就沒有采用其他的緩存方式.

問題就是出現在寫入plist文件上面.

遇到問題

在獲取到后臺返回的聯系人數據以后,我就將返回的list進行篩選,只是篩選出所需的用戶姓名和頭像地址.返回字段中,userId和userCode看似一樣,其實解析出來,前者是NSNuber類型,后者是NSString類型,當時只記得后臺直接使用Sqlite語句,將userCode=userId,根本沒有考慮到類型問題.心想,既然這樣,不如直接使用userId得了,于是將' [userNameDict setObject:dict[@"userName"] forKey:dict[@"userCode"]];'換成了'[userNameDict setObject:dict[@"userName"] forKey:dict[@"userId"]];'.問題就是出現在換了一個字段上.

剛開始沒有發現問題,因為之前一直使用userCode字段取值作為字典的key,所以在本地已經有了緩存.直到有一天,重新安裝App測試時才發現,聊天界面的頭像和昵稱都不在顯示,才最終想到當初換了了一個字段取值.

但是,更換為userId后,打印出來的字典一模一樣,就是writeToFile寫入plist時總是失敗.后來使用isEqualToDictionary方法比較兩個字典又是不一樣的.問題實在難找,當然解決辦法就是切換為原來的userCode,但是遇到問題一向不想通過回避的方式去解決,所以就排查原因,甚至去比較過所有的key和value值,發現還是一樣.最后,感覺實在找不出問題所在,于是去查看返回數據,于是便發現了,字段userId和userCode所對應的Value值的類型是不一樣的.這才得出一下結論

如果是可變字典,那么在使用'setObject: forKey:'方法時,如果key使用的是NSNumber類型的key,會導致writeToFile失敗.

至于為什么是這樣,有待進一步研究,當然,如果有人遇到過并找出原因,也可以回復一下,相互學習,共同進步.

附上當時代碼

- (void)saveContactListDict:(id)list { NSMutableArray *contactListArray = [NSMutableArray array]; for (NSDictionary *dict in list) {  for (NSString *key in dict) {   if ([dict[key] isKindOfClass:[NSArray class]]) {    [contactListArray addObjectsFromArray:dict[key]];   }  } } NSMutableDictionary *userNameDict = [NSMutableDictionary dictionary]; NSMutableDictionary *avatarurlDict = [NSMutableDictionary dictionary]; NSMutableDictionary *avatarurlAndNameDict = [NSMutableDictionary dictionary]; for (NSDictionary *dict in contactListArray) {  if (dict[@"userId"] == nil) {   return;  }  [userNameDict setObject:dict[@"userName"] forKey:dict[@"userId"]];  NSString *url =dict[@"avatarUrl"];  NSString *avatarUrl = [CPUtil getThumUrl:url size:CGSizeMake(200, 200)];  [avatarurlDict setObject:avatarUrl forKey:dict[@"userId"]];  if (dict[@"userName"] == nil) {   return;  }  [avatarurlAndNameDict setObject:avatarUrl forKey:dict[@"userName"]]; } NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject; NSString *userNameDictPath = [path stringByAppendingPathComponent:@"userNameDict.plist"]; NSString *avatarurlDictPath = [path stringByAppendingPathComponent:@"avatarurlDict.plist"]; NSString *avatarurlAndNameDictPath = [path stringByAppendingPathComponent:@"avatarurlAndNameDict.plist"]; [userNameDict writeToFile:userNameDictPath atomically:YES]; [avatarurlDict writeToFile:avatarurlDictPath atomically:YES]; [avatarurlAndNameDict writeToFile:avatarurlAndNameDictPath atomically:YES];}

分析問題

實際開發當中,總是有細節的東西,雖然有時候覺得,這些東西太基礎,但是就在這些基礎的知識上,我們卻忽略了一些本應該注意的點.好比說我們明明知道向數組中添加元素的時候,元素不能為空,記得考慮為nil,null的情況.這誰都知道,但是卻最容易被忽略,因為你無法確定后臺的數據返回什么,包括那些規范文檔明確要求不能為nil的字段,都有可能返回一個nil or Null .這個時候開始想靜靜了.明白這個世界其實沒有必然的東西.另外,數組越界問題也一直都在,當然為了防止App直接閃退,你可以選擇去覆蓋系統的方法......好了,言歸正傳.我們看一下蘋果官方文檔,回顧一下基礎的東西,文檔中關于NSDictionary和writeToFile有下面兩段內容

NSDictionary

*A key-value pair within a dictionary is called an entry. Each entry consists of one object that represents the key and a second object that is that key's value. Within a dictionary, the keys are unique. That is, no two keys in a single dictionary are equal (as determined by isEqual(_:)). In general, a key can be any object (provided that it conforms to the NSCopying protocol―see below), but note that when using key-value coding the key must be a string (see Accessing Object Properties). Neither a key nor a value can be nil; if you need to represent a null value in a dictionary, you should use NSNull.*

這里說,字典中的key可以是遵守NSCopying協議的任何對象類型,但是 key-value coding中的key必須是一個string.

'- (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;'

This method recursively validates that all the contained objects are property list objects (instances of NSData, NSDate, NSNumber, NSString, NSArray, or NSDictionary) before writing out the file, and returns NO if all the objects are not property list objects, since the resultant file would not be a valid property list.

這里描述了寫入文件的對象要求,也就是平時常用的 NSData, NSDate, NSNumber, NSString, NSArray, or NSDictionary這些類型,當然自定義類型不可以.

解決問題

當然最后的處理就是將NSNumber格式化為NSString,看下代碼

 NSString *dictKey = [NSString stringWithFormat:@"%@",dict[@"userId"]]; [userNameDict setObject:dict[@"userName"] forKey:dictKey];

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持武林網!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
成人性生交大片免费看视频直播| 91高潮精品免费porn| 国产精品吹潮在线观看| 精品性高朝久久久久久久| 欧美激情综合亚洲一二区| 日韩欧美一区二区三区久久| 国产精品激情自拍| 一区二区av在线| www.亚洲人.com| 日韩av电影在线播放| www.亚洲成人| 亚洲国产一区二区三区在线观看| 综合av色偷偷网| 浅井舞香一区二区| 亚洲理论电影网| 国产精品白丝av嫩草影院| 国产精品欧美日韩久久| 北条麻妃一区二区在线观看| 精品国产自在精品国产浪潮| 亚洲黄色av女优在线观看| 欧美日韩国产中文精品字幕自在自线| 成人在线播放av| 国产精品丝袜白浆摸在线| 免费91麻豆精品国产自产在线观看| 中文字幕欧美视频在线| …久久精品99久久香蕉国产| 日韩第一页在线| 亚洲老板91色精品久久| 亚洲综合视频1区| 国产97人人超碰caoprom| 亚洲天堂男人的天堂| 欧美精品成人在线| 日本成人激情视频| 欧美极度另类性三渗透| 久久久久久久久综合| 亚洲国产精品小视频| 欧美性猛交xxxx富婆| 在线a欧美视频| 欧美一区二区三区……| 久久不射热爱视频精品| 日韩中文视频免费在线观看| 中文字幕日韩免费视频| 国产又爽又黄的激情精品视频| 日韩国产精品亚洲а∨天堂免| 在线视频欧美性高潮| 97精品视频在线| 日韩成人免费视频| 久久黄色av网站| 亚洲精品suv精品一区二区| 成人黄色在线免费| 91久久国产婷婷一区二区| 精品一区二区亚洲| 久久久久成人精品| 精品国产精品自拍| 国产亚洲欧美日韩一区二区| 有码中文亚洲精品| 国产在线98福利播放视频| 日韩在线观看免费全集电视剧网站| 97热在线精品视频在线观看| 国产91精品久久久| 中文亚洲视频在线| 成人免费在线视频网站| 欧美成人免费小视频| 国产丝袜一区二区三区| 欧美肥老妇视频| 日本久久亚洲电影| 日韩av网址在线观看| 久久精品国产成人| 欧美激情在线观看| 日韩国产高清污视频在线观看| 成人午夜激情免费视频| 亚洲精品91美女久久久久久久| 国产精品露脸自拍| 欧美性生交大片免费| 欧美日韩国产中字| 久久久久久久久爱| 欧美电影免费观看| 久久99精品视频一区97| 中文字幕在线成人| 欧美成人黑人xx视频免费观看| 日韩中文字在线| 久久精品夜夜夜夜夜久久| 国产不卡av在线| 亚洲精品理论电影| 日韩欧美在线视频观看| 91视频-88av| 美女啪啪无遮挡免费久久网站| 青青精品视频播放| 国产日韩欧美成人| 欧美激情视频在线免费观看 欧美视频免费一| 久久这里有精品| 久久久成人精品| 国产精品美女免费看| 日韩中文视频免费在线观看| 国产精品久久不能| 国产一区二区在线免费视频| 中国人与牲禽动交精品| 成人福利免费观看| 国内精品国产三级国产在线专| 国产福利视频一区| 久久久久久久久久久免费精品| 亚洲无av在线中文字幕| 国产精品网站大全| 91av在线影院| 日韩成人在线视频观看| 精品一区二区三区四区在线| 成人黄色大片在线免费观看| 国产精品第一页在线| 久久国产精品久久久久| 日本精品中文字幕| 亚洲成人av中文字幕| 久久久久北条麻妃免费看| 国产第一区电影| 国产亚洲激情视频在线| 欧洲精品久久久| 日韩免费在线电影| 色老头一区二区三区在线观看| 欧美日韩成人网| 97精品免费视频| 91天堂在线视频| 亚洲资源在线看| 亚洲男人天堂视频| 国产精品中文字幕久久久| 国自产精品手机在线观看视频| 亚洲精品之草原avav久久| 国产成人精品日本亚洲专区61| 一区二区三区 在线观看视| 国产精品露脸av在线| 国产成人亚洲综合91精品| 国产精品一区二区久久国产| 一区二区三区动漫| 粗暴蹂躏中文一区二区三区| 色妞久久福利网| 亚洲第五色综合网| 国产91久久婷婷一区二区| 色综合久久天天综线观看| 国产97在线观看| 亚洲va久久久噜噜噜| 亚洲在线一区二区| 亚洲美女www午夜| 成人午夜激情免费视频| 97热精品视频官网| 国产精品aaa| 日韩一区二区三区xxxx| 久久久久久九九九| 国产精品高精视频免费| 精品国产成人在线| 成人写真视频福利网| 亚洲欧洲黄色网| 亚洲精品电影在线| 久久伊人91精品综合网站| 一区二区欧美亚洲| 国产欧美亚洲视频| 欧美一级在线亚洲天堂| 丝袜美腿精品国产二区| 久久夜色精品国产欧美乱| 国产日韩精品综合网站| 亚洲第一国产精品| 久久久久久亚洲精品不卡| 中文国产成人精品久久一| 91亚洲人电影| 亚洲成人激情图| 国产精品视频导航| 国产欧美精品一区二区三区-老狼|