最近一个月时间在做一个小项目,它是属于移动通信类的一个扫码工具app,功能比较简单,主要有:登录、记住密码、工程信息同步、工程信息详情展示、扫描二维码获取本地数据展示、扫码记录、用户切换。如下所示:
1.扫码功能本地数据路径读取问题。
这个小项目的核心功能就是扫码,首次登录的时候,会从接口请求一个压缩包的下载链接,然后保存到沙盒的library文件中,接着解压出来,里面是一个txt的文本,文本中是6组数据,如下所示:
用AFN请求数据,解压是通过第三方OC框架SSZipArchive,这个框架具体的用法请百度,这里不再详述,完成了这两步之后,就是读取文本中的数据,写入plist文件中,然后把plist文件存入沙盒中,这些全部在首次登录成功后进入主界面全部要实现,具体读取写入代码如下:
扫码这几步实现都比较顺畅,接下来就遇到第一个问题,这个app,之所以做本地存取,扫码读取数据,就是为了在无网络情况下也能够无障碍使用,只要第一次登录成功之后,所有的数据都获取到之后,做本地缓存,在无网络情况下,通过本地存储来获取。
一开始,我的思路是读取文件之后,获取HomeData.plist路径文件,然后把文件路径保存下来,进入扫码界面的时候,直接读取文件路径,把plist中的字典数组存入可变数组dicArr中,如下代码所示,在断网的时候,本地路径和文件都存在沙盒中,但dicArr为null。
上面的方法表明,在无网络的情况下,直接读取路径的方式是不可行的,解决的方法就是,取消掉传filename路径的方式,直接在扫码的控制器中,通过沙盒,直接读取,如下代码所示:
2.扫码详情界面展示问题。
路径问题解决,实现了有网无网的情况下,数组都有值了,接着就是要扫码获取到二维码中的两个id,来判断数组中哪组数据匹配,展示到详情界面上去,详情界面如下图所示:
通过AVCaptureMetadataOutputObjectsDelegate的方法,扫码二维码,获取到二维码中的3个值,如下所示:
到了这里,我碰到两个问题,第一,我要如何通过id判断是数组中的哪一组字典,然后保存到新的字典中,传到下一个界面?第二,扫码记录界面只需要获取3个字段,应该如何在扫码记录的控制器中获取到?扫码记录界面如下所示:
首先解决第一个问题,通过格式转换获取到二维码中的portId和coupledId,然后通过for循环判断数组中每一个字典的id的值是否与portId或者coupledId,如果相同,就分别存入字典portDict和coupledDict,传到展示界面去做处理。当然了,还做了错误的二维码的处理。
接着,解决第二个问题,我在AVCaptureMetadataOutputObjectsDelegate代理方法中,创建了一个NSMutableDictionary,扫码记录只需要3个字段,我通过第一个问题中的for循环判断过程中,获取到3个字段的值,存入tempDict中,然后把tempDict添加到tempArr中,再将tempArr写入tempData.plist文件,存储在沙盒中,在扫码记录界面中,再去一条条展示在tableview上面。
如下代码所示:
总结:本地存储是一种很好的方式,NSUserDefault、plist、数据库、CoreData都有不同作用,这个小项目采用了前两种,由于我本人之前做的几个app都是没有做本地缓存的逻辑,所以,这个项目的开发过程中,有不少问题,给我留下了深刻的印象,也学到不少经验,代码的水平提升,最直接的方式,就是实现业务逻辑、实现功能的过程中,自己不断地总结,希望自己能够变得更加厉害,也希望各位大神多多指教。
网友评论