本地缓存

原来的思路是把本地下载下来的数据写道sqllite数据库中,但是以后用的时间没有办法确定写在数据库中的文件在界面上应该显示的位置。被这个问题纠结了好长时间。周围ios开发人员对缓存又不太熟悉。直到来到现在的公司才有合适的人给解决了这个问题。其实思路并不是很难。

1.首先,对下载下来的数据(json或xml)经过自己的解析,一般是存为NSArray或者NSDictionary的数据源对象。其中数据源中的每个对象(model)都要实现NSCoding协议。

Example:我们的项目中有一个表示活动的model类。其中有getter和setter方法,代码就不贴出来了。其中有userid,activityid,messageCount,memberCount等属性。在实现NSCodeing协议后。有两个协议方法要在model类中实现。代码如下:

#pragma mark – NSCoding

//keyfor value的key 不贴出

- (void)encodeWithCoder:(NSCoder*)aCoder {

[aCoder encodeInt64:self.userIdforKey:1];

[aCoder encodeInt64:self.activityidforKey:2];

[aCoder encodeInteger:self.newmessagecountforKey:3];

[aCoder encodeInteger:self.newmembercountforKey:4];

}

- (id)initWithCoder:(NSCoder*)aDecoder {

self =[superinit];

if (self) {

self.userId  = [aDecoder decodeInt64ForKey:1];

self.activityid =[aDecoder decodeInt64ForKey:2];

self.newmessagecount =[aDecoder decodeIntegerForKey:3];

self.newmembercount =[aDecoder decodeIntegerForKey:4];

}

returnself;

}

注意:如果某个model中有NSMutableArray或NSMutableDictionary的属性,属性中如果存的不是向int,double,NSString等基本类型,也就是说,model中某个属性是其他model或者其他model的集合,则这些子model也要实现NSCoding协议。直到这个链中的属性都被基本类型位置。至于可以编码解码的函数可以去NSCoder.h中去找。

2.这样最重要的一步已经完成,然后就可以把网络请求返回的数据源存在本地。

//指定沙盒文件路径[FileOperDocumentFilePath:fileName].不用判断文件是否存在,同名会覆盖。

- (void)saveMyActionData:(NSMutableArray *)fileArraywithFileName:(NSString*)fileName

{

if(fileArray == nil) {

return;

}

NSMutableData*data = [[NSMutableDataalloc] init];

NSKeyedArchiver*archiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];

[archiverencodeObject:fileArray forKey:fileName];

[archiverfinishEncoding];

[data writeToFile: [FileOperDocumentFilePath:fileName]atomically:YES];

[archiverrelease];

[data release];

}

3.然后在用的时间从沙盒中把缓存文件load出来。

- (NSMutableArray *)loadMyActionData:(NSString *)fileName

{

NSMutableArray *actionArray = nil;

NSData*data = [[NSMutableDataalloc] initWithContentsOfFile: [FileOperDocumentFilePath:fileName]];

if(data) {

NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:data];

actionArray = [unarchiver decodeObjectForKey:fileName];

[unarchiver release];

}

[data release];

returnactionArray;

}

时间: 2024-10-10 18:19:37

本地缓存的相关文章

关于java中的本地缓存-总结概述

java中的本地缓存,工作后陆续用到,一直想写,一直无从下手,最近又涉及到这方面的问题了,梳理了一下.自己构造单例.guava.ehcache基本上涵盖了目前的大多数行为了.   为什么要有本地缓存? 在 系统中,有些数据,数据量小,但是访问十分频繁(例如国家标准行政区域数据),针对这种场景,需要将数据搞到应用的本地缓存中,以提升系统的访问效率,减 少无谓的数据库访问(数据库访问占用数据库连接,同时网络消耗比较大),但是有一点需要注意,就是缓存的占用空间以及缓存的失效策略. 为什么是本地缓存,而

内容和图片在从网络上获取到之后都会存入到本地缓存中

内容和图片在从网络上获取到之后都会存入到本地缓存中,因此即使手机在没有网络的情况下依然能够加载出以前浏览过的新闻.而使用的缓存技术不用多说,自然是DiskLruCache了,那么首先第一个问题,这些数据都被缓存在了手机的什么位置呢? 其实DiskLruCache并没有限制数据的缓存位置,可以自由地进行设定,但是通常情况下多数应用程序都会将缓存的位置选择为 /sdcard/Android/data/<application package>/cache 这个路径.选择在这个位置有两点好处:第一,

浏览器本地缓存

Nginx浏览器本地缓存设置 浏览器缓存,是为了加速浏览 浏览器在用户磁盘上对最近请求过的文档进行存储,当访问者再次请求这个页面时,浏览器自动从本地磁盘显示文档,这样可以加速页面浏览 浏览器缓存通过 expires 指令输出 Header 头来实现 语法:expires [time|epoch|max|off] 默认值:expires off 作用域:http.server.location 使用举例: 对 js.css本地缓存一小时,对图片本地缓存30天 location ~ .*\.(js|

Android -- ImageLoader本地缓存

传送门 <Android -- ImageLoader简析>  http://www.cnblogs.com/yydcdut/p/4008097.html 本地缓存 在缓存文件时对文件名称的修改提供了两种方式,每一种方式对应了一个Java类 1)  HashCodeFileNameGenerator,该类负责获取文件名称的hashcode然后转换成字符串. 2)  Md5FileNameGenerator,该类把源文件的名称同过md5加密后保存. 两个类都继承了FileNameGenerato

Java8简单的本地缓存实现

译文出处: 踏雁寻花   原文出处:lukaseder 这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存.因为Map有一个新的方法,在key为Null的时候自动计算一个新的value值.非常适合实现cache.来看下代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public static void main(String[] args) {     for (int i = 0; i < 10; i++)   

iOS 本地缓存实现 方案借鉴

在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这里为了简单起见这里,我们在请求url资源的时候,给每次请求的文件设定一个过期的时间. 4.可以实现:如果文件已经被

关于本地缓存

今天电面时被问到了UIWebView的本地缓存,之前未关注过webview的缓存,所以查了下博文 原文链接:http://blog.csdn.net/zhuqilin0/article/details/6653532 在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是

安卓网络请求图片到图片的三级缓存技术(内存缓存,本地缓存,网络缓存)

安卓网络请求图片,对于我们来说并不陌生,因为每个应用都有可能会用到这一技术.通常情况下,我们第一次都是从网络上请求图片资源,然后将 图片资源保存到内存和本地,下一次动态显示图片的时候就不需要再从网络上请求图片资源了,直接从本地或者内存中获取就可以了.这就涉及到图片 的三级缓存技术,分别是内存缓存,本地缓存,网络缓存. 缓存的流程图: 首先我们定义一个类叫ClassLoader: package com.jsako.showprodinfodemo; import java.io.FileOutp

本地缓存机制之一

在手机应用程序开发中,为了减少与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存,这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足下面这些功能. 1.可以将数据缓存到本地磁盘. 2.可以判断一个资源是否已经被缓存.如果已经被缓存,在请求相同的资源,先到本地磁盘搜索. 3.可以判断文件缓存什么时候过期.这里为了简单起见这里,我们在请求url资源的时候,给每次请求的文件设定一个过期的时间. 4.可以实现:如果文件已经被

设计一个移动应用的本地缓存机制

在手机应用程序开发中,为了降低与服务端的交互次数,加快用户的响应速度,一般都会在iOS设备中加一个缓存的机制,前面一篇文章介绍了iOS设备的内存缓存.这篇文章将设计一个本地缓存的机制. 功能需求 这个缓存机制满足以下这些功能. 1.能够将数据缓存到本地磁盘. 2.能够推断一个资源是否已经被缓存.假设已经被缓存.在请求同样的资源.先到本地磁盘搜索. 3.能够推断文件缓存什么时候过期.这里为了简单起见这里,我们在请求url资源的时候.给每次请求的文件设定一个过期的时间. 4.能够实现:假设文件已经被