上个项目的一些反思 III
离线缓存
之前的项目因为实时性要求比较高,所以一打开客户端,就开始做网络请求.现在想想,是没有做内容的离线缓存.这个问题,我没意识到.产品经理也没有意识到...
我觉得Archiver,来做比较合适,可复写.可直接从存储中读取model,(当然要在相应的model里实现NSCoding协议)代码如下
#pragma mark ============实现NSCoding协议 //归档
- (void)encodeWithCoder:(NSCoder *)Coder
{ NSDate * senddate=[NSDate date]; NSDateFormatter *dateformatter=[[NSDateFormatter alloc] init]; [dateformatter setDateFormat:@"YYYY-MM-dd,hh:mm:ss"]; NSString *str = [NSString stringWithFormat:@"Cached@:%@",[dateformatter stringFromDate:senddate]]; [Coder encodeObject:_citynm forKey:@"CityName"];
[Coder encodeObject:_weather forKey:@"Weather"];
[Coder encodeObject:_temperature_curr forKey:@"NowTemp"];
[Coder encodeObject:str forKey:@"days"];
[Coder encodeObject:UIImagePNGRepresentation(_Logo) forKey:@"img"]; } //解档
- (nullable instancetype)initWithCoder:(NSCoder *)Decoder // NS_DESIGNATED_INITIALIZER
{ if (self = [super init]) { self.citynm = [Decoder decodeObjectForKey:@"CityName"];
self.weather = [Decoder decodeObjectForKey:@"Weather"];
self.temperature_curr = [Decoder decodeObjectForKey:@"NowTemp"];
self.days = [Decoder decodeObjectForKey:@"days"];
self.Logo = [UIImage imageWithData:[Decoder decodeObjectForKey:@"img"]]; } return self;
}
Archiver的封装
#import <Foundation/Foundation.h> @interface ArchiverCache : NSObject /**
* 归档
*
* @param model model
* @param Key Key
*/
-(void)EncoderDoWithModel:(id)model withKey:(NSString*)Key; /**
* 反归档
*
* @param Key
*
* @return (id)Model
*/
-(id)UncoderDoWith:(NSString*)Key; @end ====================.M================= #import "ArchiverCache.h" @implementation ArchiverCache //archiver
-(void)EncoderDoWithModel:(id)model withKey:(NSString *)Key
{
NSMutableData *data = [[NSMutableData alloc] init]; //创建归档辅助类
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; //编码
[archiver encodeObject:model forKey:Key];
//结束编码
[archiver finishEncoding];
//写入 if ([data writeToFile:[self GetFilePath] atomically:YES]) { NSLog(@"Cache Set Success"); }else{ NSLog(@"Cache Set Fail"); } } //Unarchiver
-(id)UncoderDoWith:(NSString *)Key
{
///////////////////////解档
NSData *_data = [[NSData alloc] initWithContentsOfFile:[self GetFilePath]];
//解档辅助
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:_data]; //解码并解档出model
id Wm = [unarchiver decodeObjectForKey:Key];
//关闭解档
[unarchiver finishDecoding]; return Wm;
} -(NSString *)GetFilePath
{
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
//虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。
NSString *cachePath = [arr lastObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"Model"];
// NSLog(@"%@",filePath); return filePath;
}
@end
调用,在这个例子里,每次进行model操作的时候,都会直接进行归档操作.这样可以保持归档里的数据都是最新的.
-(id)NetViewModelWithCache
{
//读取缓存...
ArchiverCache *ar = [[ArchiverCache alloc] init];
//需在相应的model实现 initWithCoder;
WeatherModel *Wm = [ar UncoderDoWith:@"weather"]; return Wm;
} -(id)ConvertToModel:(id)Data
{ WeatherModel *model = [[WeatherModel alloc] initWithDictionary:Data]; ///转成模型,同时把IMG给下载了.....由于API里的ICON是GIF,为了省事,这里直接另找了一张图.(可用sdwebimage来处理gif)
NSString *imageURLStr = @"http://pic.58pic.com/58pic/15/48/73/04f58PIC37y_1024.png"; NSData *imageData = [[NSData alloc] initWithContentsOfURL:[NSURL URLWithString:imageURLStr]]; model.Logo = [UIImage imageWithData:imageData]; ArchiverCache *ar = [[ArchiverCache alloc] init]; //需在相应的model实现 encodeWithCoder;
[ar EncoderDoWithModel:model withKey:@"weather"]; return model;
}
上个项目的一些反思 III的更多相关文章
- 上个项目的一些反思 II
上个项目需要使用通讯录,我在回顾自己设计的时候,发现自己少设计了cache这一环. 虽然直接用SQLite在初期体验上没什么大损失,不过可以预想通讯录增长到一定数量后势必会影响体验. 单例模式,全局缓 ...
- 上个项目的一些反思 I
最近一直在反思之前的项目,发现了很多问题.比如数据安全... 虽然项目需求是只展示最新的数据,所以几乎没用什么本地存储.除了通讯录和用户的Token. 用户通讯录另表,今天反思下用户的Token的存储 ...
- git上传项目代码到github
参考: git学习——上传项目代码到github github上传时出现error: src refspec master does not match any解决办法 git 上传本地文件到gith ...
- GitHub的用法:到GitHub上部署项目
先提供两个较好的Git教程: 1. 如何在github部署项目: lhttp://jingyan.baidu.com/article/656db918fbf70ce381249c15.html 2. ...
- 如何从eclipse中下载并导入Github上的项目
eclipse导入项目,方法就是点击File ->Import,选择Existing Projects into Workspace 但前提是,你导入的这个项目原本就是用eclipse的构建的, ...
- 参与github上开源项目的大致流程和注意事项
Foreword github是一个很火的代码托管服务网站,可能好多人都想参与一两个项目玩一玩学习一下,但由于是纯英文的网站,可能又会止步于想法上没有动手实践.接下来我就介绍一下参与github上开源 ...
- 在GitHub上管理项目
在GitHub上管理项目 新建repository 本地目录下,在命令行里新建一个代码仓库(repository) 里面只有一个README.md 命令如下: touch README.md git ...
- Eclipse-将svn上的项目转化成相应的项目
这里假设svn上的项目为maven项目 首先从svn检出项目 其中项目名称code可自己定义更改新的名称 从svn检出的项目结构 然后将项目转化成相关的项目 转换加载中 加载/下载 maven相关内容 ...
- 利用gitbash上传项目到github
GitHub主要是用作基于Git的分布式版本管理系统的库,可以保存和管理自己的代码,而且主要用作代码的合作开发.不过对于我来说,Git控制系统还比较难以掌握,或者开发小系统还不太用得着,因此我把Git ...
随机推荐
- FineUI(专业版)v3.0.0 发布,手机、平板和桌面全支持!
FineUI(专业版)v3.0.0 已经正式发布,全面支持手机.平板和桌面! 自 2008 年 4 月发布第一个版本,我们持续更新了 126 个版本,拥有 16000 多位注册用户,130 ...
- Spring + SpringMVC + Druid + MyBatis 给你一个灵活的后端解决方案
生命不息,折腾不止. 折腾能遇到很多坑,填坑我理解为成长. 两个月前自己倒腾了一套用开源框架构建的 JavaWeb 后端解决方案. Spring + SpringMVC + Druid + JPA(H ...
- 侯捷老师C++大系之C++面向对象开发:(一)不带指针的类:Complex复数类的实现过程
一.笔记1.C++编程简介 2.头文件与类的声明 防卫式声明#ifndef __COMPLEX__#define __COMPLEX__ …… #endif头文件的布局模板简介template< ...
- Android样式和主题
样式:style--> 主题:theme--> <style name="my_style"> <item name="android:te ...
- 表单验证插件之jquery.validate.js
提到表单验证的插件,第一个想到的就是jquery.validate.js,所以小生想在这里稍微详细地说一下这款插件的具体使用方法,便于理解,我直接附上整段demo的代码(没怎么调样式,主要是看js): ...
- 信鸽推送 10004,os文件配置出错,解决办法
信鸽推送注册失败 返回码 10004 是 os 配置出现问题 经过询问客服,得到以下解决办法 将SDK中的so文件复制下来 新建文件夹jniLibs,并将 so 配置文件粘贴进去 便可完成注册
- Java_jvisualvm使用JMX连接远程机器(实践)
https://my.oschina.net/heroShane/blog/196227 一.启动普通的jar程序 1.执行foo.jar启动命令 java -Dcom.sun.management. ...
- web.xml加载顺序
一 1.启动一个WEB项目的时候,WEB容器会去读取它的配置文件web.xml,读取<listener>和<context-param>两个结点. 2.紧急着,容创建一个Ser ...
- Android基础总结(三)
测试 黑盒测试 测试逻辑业务 白盒测试 测试逻辑方法 根据测试粒度 方法测试:function test 单元测试:unit test 集成测试:integration test 系统测试:syste ...
- Markdown与标记语言
Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分简单.常用的标记符号也不 ...