IOS开发中缓存策略
方法一:一般将服务器第一次返回的数据保存在沙盒里面。这样在手机断网的情况下可以从本地读取数据了。
1.保存到沙盒的代码:
- + (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;
- {
- NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
- NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
- [setting setObject:str forKey:key];
- [setting synchronize];
- }
2.读取本地沙盒的代码
读取之前首先根据type和Id判断本地是否有
- + (NSString *)getCache:(int)type andID:(int)_id
- {
- NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
- NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
- NSString *value = [settings objectForKey:key];
- return value;
- }
如果沙盒里面有数据
- NSString *value = [Tool getCache:5 andID:self.QiuTime];
- if (value) {
- NSDictionary *backdict = [value JSONValue];
- if ([backdict objectForKey:@"items"]) {
- NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];
- for (NSDictionary *qiushi in array) {
- QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];
- [self.list addObject:qs];
- }
- }
- [self.tableView reloadData];
- }
- [self.tableView tableViewDidFinishedLoadingWithMessage:@"数据全部加载完了.."];
- self.tableView.reachedTheEnd = YES;
1、设置全局的Cache
在AppDelegate.h中添加一个全局变量
- @interface AppDelegate : UIResponder
- {
- ASIDownloadCache *myCache;
- }
- @property (strong, nonatomic) UIWindow *window;
- @property (nonatomic,retain) ASIDownloadCache *myCache;
在AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代码
- //自定义缓存
- ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
- self.myCache = cache;
- [cache release];
- //设置缓存路径
- NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
- NSString *documentDirectory = [paths objectAtIndex:0];
- [self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
- [self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];
在AppDelegate.m中的dealloc方法中添加如下语句
- [myCache release];
到这里为止,就完成了全局变量的声明。
2、设置缓存策略
在实现ASIHTTPRequest请求的地方设置request的存储方式,代码如下
- NSString *str = @"http://....../getPictureNews.aspx";
- NSURL *url = [NSURL URLWithString:str];
- ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
- //获取全局变量
- AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
- //设置缓存方式
- [request setDownloadCache:appDelegate.myCache];
- //设置缓存数据存储策略,这里采取的是如果无更新或无法联网就读取缓存数据
- [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
- request.delegate = self;
- [request startAsynchronous];
3、清理缓存数据
我在这里采用的是手动清理数据的方式,在适当的地方添加如下代码,我将清理缓存放在了应用的设置模块:
- AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
- [appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
这里清理的是ASICachePermanentlyCacheStoragePolicy这种存储策略的缓存数据,如果更换其他的参数的话,即可清理对应存储策略的缓存数据。
IOS开发中缓存策略的更多相关文章
- GIT在iOS开发中的使用
前言 在iOS开发中,很多公司对项目的版本控制管理都使用了git,当然也有部分公司使用的是svn.当年我最初接触的是svn,觉得使用起来挺方便的,但是每次切分支都需要下载一份新的代码起来,这实在太麻烦 ...
- iOS开发UI篇—iOS开发中三种简单的动画设置
iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...
- 深入理解 iOS 开发中的锁
来源:伯乐在线 - 夏天然后 链接:http://ios.jobbole.com/89474/ 点击 → 申请加入伯乐在线专栏作者 摘要 本文的目的不是介绍 iOS 中各种锁如何使用,一方面笔者没有大 ...
- iOS 开发中常见的设计模式
最近有小伙伴问到在iOS开发中的几种设计模式,这里摘录一下别人的总结(因为已经感觉总结得差不多了,适用的可以阅读一下) 首先是开发中的23中设计模式分为三大类:1.创建型 2.结构型 3.行为型 (i ...
- iOS开发中关于UIImage的知识点总结
UIImage是iOS中层级比较高的一个用来加载和绘制图像的一个类,更底层的类还有 CGImage,以及iOS5.0以后新增加的CIImage.今天我们主要聊一聊UIImage的三个属性: image ...
- iOS开发中遇到的一些问题及解决方案【转载】
iOS开发中遇到的一些问题及解决方案[转载] 2015-12-29 [385][scrollView不接受点击事件,是因为事件传递失败] // // MyScrollView.m // Creat ...
- 【swift,oc】ios开发中巧用自动布局设置自定义cell的高度
ios开发中,遇到自定义高度不定的cell的时候,我们通常的做法是抽取一个frame类,在frame类中预算好高度,再返回. 但是苹果出来自动布局之后...春天来了!!来看看怎么巧用自动布局设置自定义 ...
- iOS开发中常见的一些异常
iOS开发中常见的异常包括以下几种NSInvalidArgumentExceptionNSRangeExceptionNSGenericExceptionNSInternallnconsistency ...
- 总结iOS开发中的断点续传那些事儿
前言 断点续传概述 断点续传就是从文件赏赐中断的地方重新开始下载或者上传数据,而不是从头文件开始.当下载大文件的时候,如果没有实现断点续传功能,那么每次出现异常或者用户主动的暂停,都会从头下载,这样很 ...
随机推荐
- fuser解决The requested resource is busy
AIX 下出现umount busy | 处理 2011-08-17 17:22:57| 分类: AIX|字号 订阅如果一个文件系统打开了一个文件,那么必须在卸载之前将该文件关闭.例如:# umo ...
- java多线程通过管道流实现不同线程之间的通信
java中的管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据.一个线程发送数据到输出管道,另外一个线程从输入管道中读取数据.通过使用管道,实现不同线程间的通信,而不必借助类似 ...
- Spring Boot使用mongo的GridFS模块
1. GridFS简介 GridFS是Mongo的一个子模块,使用GridFS可以基于MongoDB来持久存储文件.并且支持分布式应用(文件分布存储和读取).作为MongoDB中二进制数据存储在数据库 ...
- Java学习第十六天
1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...
- vue将数据绑定到属性中
*必须使用[] <tr v-for="(p,index) in prodects"> @*v-bind:class="styleType(index)&quo ...
- Linux 拷贝
拷贝文件夹下所有内容到另一个文件夹: cp -rf 源文件 目标文件 例如:cp -rf /home/efs/Desktop/WEB-INF/* /opt/IBM/WebSphere/AppServe ...
- Hibernate课程 初探多对多映射2-1 创建数据库表
--创建表 -- 创建项目表 create table project( proid int(10) not null comment '项目Id', proname varchar(30) co ...
- 1.字符串池化(intern)机制及拓展学习
1.字符串intern机制 用了这么久的python,时刻和字符串打交道,直到遇到下面的情况: a = "hello" b = "hello" print(a ...
- (十)JavaScript之【DOM定义】
DOM定义Document Object Model 文档对象模型 是干什么的?改变 HTML 元素的内容 (innerHTML)改变 HTML 元素的样式 (CSS)改变 HTML 元素的属性对 H ...
- Errors while uninstall the reporting extensions
"Microsoft.crm.setup.Srsdataconnector UnregisterServer Action操作失败:Requested value 'geo' was not ...