iOS開(kāi)發(fā)中,讀取服務(wù)器返回的JSON數(shù)據(jù)是非常常見(jiàn)的一種操作,一般來(lái)說(shuō),我們會(huì)通過(guò)網(wǎng)絡(luò)請(qǐng)求獲取JSON數(shù)據(jù),然后將其解析為模型對(duì)象再進(jìn)行頁(yè)面展示。如果每次用戶(hù)打開(kāi)應(yīng)用程序都要重新發(fā)起一次請(qǐng)求獲取數(shù)據(jù),無(wú)疑會(huì)嚴(yán)重影響應(yīng)用的性能和用戶(hù)體驗(yàn)。因此,在iOS開(kāi)發(fā)中,將JSON數(shù)據(jù)緩存到本地是很有必要的一種技巧。
//讀取JSON數(shù)據(jù)并緩存 -(void)loadData{ //判斷緩存是否存在 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"data.json"]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSDictionary *dict = nil; if ([fileManager fileExistsAtPath:filePath]) { dict = [NSDictionary dictionaryWithContentsOfFile:filePath]; //如果緩存存在并且不為空,則直接讀取緩存 if (dict) { //將緩存數(shù)據(jù)轉(zhuǎn)換成模型對(duì)象 [self parseDataWithDict:dict]; return; } } //如果緩存不存在或者為空,則發(fā)起網(wǎng)絡(luò)請(qǐng)求獲取數(shù)據(jù) NSURLSession *session = [NSURLSession sharedSession]; NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://example.com/data.json"]]; NSURLSessionDataTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) { if (!error) { //將響應(yīng)數(shù)據(jù)轉(zhuǎn)換成JSON字符串 NSString *jsonString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding]; //將JSON字符串轉(zhuǎn)換成字典 NSDictionary *jsonDict = [self dictionaryWithJsonString:jsonString]; //將字典存儲(chǔ)到本地緩存 [jsonDict writeToFile:filePath atomically:YES]; //將字典數(shù)據(jù)轉(zhuǎn)換成模型對(duì)象 [self parseDataWithDict:jsonDict]; }else{ NSLog(@"請(qǐng)求失敗:%@",error); } }]; [task resume]; }
在上述代碼中,我們首先判斷本地緩存是否存在,如果存在且不為空,則直接讀取緩存數(shù)據(jù)并轉(zhuǎn)換成對(duì)應(yīng)的模型對(duì)象;如果本地緩存不存在或者為空,則通過(guò)網(wǎng)絡(luò)請(qǐng)求獲取JSON數(shù)據(jù),并將其轉(zhuǎn)換成字典對(duì)象存儲(chǔ)到本地,然后再將字典對(duì)象轉(zhuǎn)換成模型對(duì)象。
通過(guò)將JSON數(shù)據(jù)緩存到本地,可以大大提高應(yīng)用程序的性能和用戶(hù)體驗(yàn),同時(shí)還可以減輕服務(wù)器的壓力。