最近一個月時間在做一個小項目赂弓,它是屬于移動通信類的一個掃碼工具app,功能比較簡單哪轿,主要有:登錄盈魁、記住密碼、工程信息同步窃诉、工程信息詳情展示杨耙、掃描二維碼獲取本地數(shù)據(jù)展示赤套、掃碼記錄、用戶切換珊膜。如下所示:
1.掃碼功能本地數(shù)據(jù)路徑讀取問題容握。
這個小項目的核心功能就是掃碼,首次登錄的時候车柠,會從接口請求一個壓縮包的下載鏈接剔氏,然后保存到沙盒的library文件中,接著解壓出來竹祷,里面是一個txt的文本谈跛,文本中是6組數(shù)據(jù),如下所示:
用AFN請求數(shù)據(jù)塑陵,解壓是通過第三方OC框架SSZipArchive感憾,這個框架具體的用法請百度,這里不再詳述令花,完成了這兩步之后阻桅,就是讀取文本中的數(shù)據(jù),寫入plist文件中彭则,然后把plist文件存入沙盒中鳍刷,這些全部在首次登錄成功后進入主界面全部要實現(xiàn),具體讀取寫入代碼如下:
掃碼這幾步實現(xiàn)都比較順暢俯抖,接下來就遇到第一個問題输瓜,這個app,之所以做本地存取芬萍,掃碼讀取數(shù)據(jù)尤揣,就是為了在無網(wǎng)絡(luò)情況下也能夠無障礙使用,只要第一次登錄成功之后柬祠,所有的數(shù)據(jù)都獲取到之后北戏,做本地緩存,在無網(wǎng)絡(luò)情況下漫蛔,通過本地存儲來獲取嗜愈。
一開始,我的思路是讀取文件之后莽龟,獲取HomeData.plist路徑文件蠕嫁,然后把文件路徑保存下來,進入掃碼界面的時候毯盈,直接讀取文件路徑剃毒,把plist中的字典數(shù)組存入可變數(shù)組dicArr中,如下代碼所示,在斷網(wǎng)的時候赘阀,本地路徑和文件都存在沙盒中益缠,但dicArr為null。
上面的方法表明基公,在無網(wǎng)絡(luò)的情況下幅慌,直接讀取路徑的方式是不可行的,解決的方法就是酌媒,取消掉傳filename路徑的方式欠痴,直接在掃碼的控制器中,通過沙盒秒咨,直接讀取喇辽,如下代碼所示:
2.掃碼詳情界面展示問題。
路徑問題解決雨席,實現(xiàn)了有網(wǎng)無網(wǎng)的情況下菩咨,數(shù)組都有值了,接著就是要掃碼獲取到二維碼中的兩個id陡厘,來判斷數(shù)組中哪組數(shù)據(jù)匹配抽米,展示到詳情界面上去,詳情界面如下圖所示:
通過AVCaptureMetadataOutputObjectsDelegate的方法糙置,掃碼二維碼云茸,獲取到二維碼中的3個值,如下所示:
到了這里谤饭,我碰到兩個問題标捺,第一,我要如何通過id判斷是數(shù)組中的哪一組字典揉抵,然后保存到新的字典中亡容,傳到下一個界面?第二冤今,掃碼記錄界面只需要獲取3個字段闺兢,應(yīng)該如何在掃碼記錄的控制器中獲取到?掃碼記錄界面如下所示:
首先解決第一個問題戏罢,通過格式轉(zhuǎn)換獲取到二維碼中的portId和coupledId屋谭,然后通過for循環(huán)判斷數(shù)組中每一個字典的id的值是否與portId或者coupledId,如果相同龟糕,就分別存入字典portDict和coupledDict戴而,傳到展示界面去做處理。當然了翩蘸,還做了錯誤的二維碼的處理。
接著淮逊,解決第二個問題催首,我在AVCaptureMetadataOutputObjectsDelegate代理方法中扶踊,創(chuàng)建了一個NSMutableDictionary,掃碼記錄只需要3個字段郎任,我通過第一個問題中的for循環(huán)判斷過程中秧耗,獲取到3個字段的值,存入tempDict中舶治,然后把tempDict添加到tempArr中分井,再將tempArr寫入tempData.plist文件,存儲在沙盒中霉猛,在掃碼記錄界面中尺锚,再去一條條展示在tableview上面。
如下代碼所示:
總結(jié):本地存儲是一種很好的方式惜浅,NSUserDefault瘫辩、plist、數(shù)據(jù)庫坛悉、CoreData都有不同作用伐厌,這個小項目采用了前兩種,由于我本人之前做的幾個app都是沒有做本地緩存的邏輯裸影,所以挣轨,這個項目的開發(fā)過程中,有不少問題轩猩,給我留下了深刻的印象卷扮,也學到不少經(jīng)驗,代碼的水平提升界轩,最直接的方式画饥,就是實現(xiàn)業(yè)務(wù)邏輯、實現(xiàn)功能的過程中浊猾,自己不斷地總結(jié)抖甘,希望自己能夠變得更加厲害,也希望各位大神多多指教葫慎。