在开发中,通常在无网络状态时,比较友好的一种处理方法是在页面上展示一个无网络的图然后加一个刷新按钮,
常规无网络页面但是在一些特定的app中,这种处理方式又显的不够友好,比如购物或者信息浏览app。这也就引申出了今天要说的页面数据保存。在app开发伊始,我对无网络的处理用的就是第一种方式,但是产品问我,可不可以在没有网络的时候展示用户上次刷新数据时的数据,让页面显得不那么空,经过思考之后发现,如果引入数据库,保存这种小量数据,有种杀鸡用牛刀的感觉,但是通常使用保存用户数据的NSUserDefaults又无法保存页面这种复杂的数据。最后决定使用归档的方式进行保存。按照这个思路:
获取沙盒路径:NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
创建模型,并遵循NSCoding协议;
获取文件全路径:NSString * pathName = [path stringByAppendingString:@"/Code.data"];
将模型赋好值后归档写入沙盒:[NSKeyedArchiver archiveRootObject:model toFile:pathName];
读取数据时解档:dataModel * model = [NSKeyedUnarchiver unarchiveObjectWithFile:pathName];
按这种操作写入时要先判断当前路径下是否已有文件,如果有则不再写入。其实到这里产品提的需求已经完成了,虽然过程和代码有一点繁琐,但是最终结果是想要的。过了一天之后我无意中在网上发现了一个方法,三行代码搞定上述一切,在我犹豫了两秒钟之后决定:改!
先说库:XHNetworkCache
使用时直接 #import "XHNetworkCache.h" 即可
网络数据存储食用方法:
//(异步)写入/更新缓存数据
//参数1:JSON数据,参数2:数据请求URL,参数3:数据请求参数(没有传nil)
[XHNetworkCache save_asyncJsonResponseToCacheFile:responseObject andURL:[LHHomeRequestURL productCateList] params:parameters completed:^(BOOL result) {
if(result){
NSLog(@"(异步)写入/更新缓存数据 成功");
}else{
NSLog(@"(异步)写入/更新缓存数据 失败");
}
}];
读取方法:
//获取缓存数据
//参数1:数据请求URL,参数2:数据请求参数(没有传nil)
id cacheJson = [XHNetworkCache cacheJsonWithURL:[LHHomeRequestURL productCateList] params:parameters];
数据读取之后使用前先判断一下cacheJson是否为空,如此简便,存取结束,内部还有一些其他的方法可以自己下载下来研究一下,在此感谢作者的奉献。
网友评论