分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报

方法一:一般将服务器第一次返回的数据保存在沙盒里面。这样在手机断网的情况下可以从本地读取数据了。

1.保存到沙盒的代码:

  1. + (void)saveCache:(int)type andID:(int)_id andString:(NSString *)str;
  2. {
  3. NSUserDefaults * setting = [NSUserDefaults standardUserDefaults];
  4. NSString * key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
  5. [setting setObject:str forKey:key];
  6. [setting synchronize];
  7. }

2.读取本地沙盒的代码

读取之前首先根据type和Id判断本地是否有

  1. + (NSString *)getCache:(int)type andID:(int)_id
  2. {
  3. NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
  4. NSString *key = [NSString stringWithFormat:@"detail-%d-%d",type, _id];
  5. NSString *value = [settings objectForKey:key];
  6. return value;
  7. }

如果沙盒里面有数据

  1. NSString *value = [Tool getCache:5 andID:self.QiuTime];
  2. if (value) {
  3. NSDictionary *backdict = [value JSONValue];
  4. if ([backdict objectForKey:@"items"]) {
  5. NSArray *array=[NSArray arrayWithArray:[backdict objectForKey:@"items"]];
  6. for (NSDictionary *qiushi in array) {
  7. QiuShi *qs=[[[QiuShi alloc]initWithDictionary:qiushi] autorelease];
  8. [self.list addObject:qs];
  9. }
  10. }
  11. [self.tableView reloadData];
  12. }
  13. [self.tableView tableViewDidFinishedLoadingWithMessage:@"数据全部加载完了.."];
  14. self.tableView.reachedTheEnd  = YES;

方法二:使用ASIHTTPRequest和ASIDownloadCache实现本地缓存

1、设置全局的Cache
    在AppDelegate.h中添加一个全局变量

  1. @interface AppDelegate : UIResponder <UIApplicationDelegate>
  2. {
  3. ASIDownloadCache *myCache;
  4. }
  5. @property (strong, nonatomic) UIWindow *window;
  6. @property (nonatomic,retain) ASIDownloadCache *myCache;

在AppDelegate.m中的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中添加如下代码

  1. //自定义缓存
  2. ASIDownloadCache *cache = [[ASIDownloadCache alloc] init];
  3. self.myCache = cache;
  4. [cache release];
  5. //设置缓存路径
  6. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  7. NSString *documentDirectory = [paths objectAtIndex:0];
  8. [self.myCache setStoragePath:[documentDirectory stringByAppendingPathComponent:@"resource"]];
  9. [self.myCache setDefaultCachePolicy:ASIOnlyLoadIfNotCachedCachePolicy];

在AppDelegate.m中的dealloc方法中添加如下语句

  1. [myCache release];

到这里为止,就完成了全局变量的声明。

2、设置缓存策略

在实现ASIHTTPRequest请求的地方设置request的存储方式,代码如下

  1. NSString *str = @"http://....../getPictureNews.aspx";
  2. NSURL *url = [NSURL URLWithString:str];
  3. ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
  4. //获取全局变量
  5. AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  6. //设置缓存方式
  7. [request setDownloadCache:appDelegate.myCache];
  8. //设置缓存数据存储策略,这里采取的是如果无更新或无法联网就读取缓存数据
  9. [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
  10. request.delegate = self;
  11. [request startAsynchronous];

3、清理缓存数据

我在这里采用的是手动清理数据的方式,在适当的地方添加如下代码,我将清理缓存放在了应用的设置模块:

  1. AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  2. [appDelegate.myCache clearCachedResponsesForStoragePolicy:ASICachePermanentlyCacheStoragePolicy];

这里清理的是ASICachePermanentlyCacheStoragePolicy这种存储策略的缓存数据,如果更换其他的参数的话,即可清理对应存储策略的缓存数据。

-----参考一:http://blog.csdn.net/kbawyg/article/details/7985513
-----参考二:http://zyc-to.blog.163.com/blog/static/17152400201110221340738/
 
 
备注:判断手机是否有网络
使用官方自带的Reachability.h判断
  1. -(BOOL)isNetworkRunning;
  2. {
  3. Reachability *r = [Reachability reachabilityWithHostName:@"http://www.baidu.com"];
  4. switch ([r currentReachabilityStatus]) {
  5. case NotReachable:
  6. return FALSE;
  7. break;
  8. case ReachableViaWWAN:
  9. return TRUE;
  10. break;
  11. case ReachableViaWiFi:
  12. return TRUE;
  13. break;
  14. }
  15. return FALSE;
  16. }

记得添加SystemConfiguration框架。

IOS开发笔记(4)数据离线缓存与读取的更多相关文章

  1. iOS开发网络篇—数据缓存

      iOS开发网络篇—数据缓存 一.关于同一个URL的多次请求 有时候,对同一个URL请求多次,返回的数据可能都是一样的,比如服务器上的某张图片,无论下载多少次,返回的数据都是一样的. 上面的情况会造 ...

  2. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  3. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  4. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  5. 李洪强iOS开发-网络新闻获取数据思路回顾

    李洪强iOS开发-网络新闻获取数据思路回顾 01 创建一个继承自AFHTTPSessionManager的工具类:LHQNetworkTool 用来发送网络请求获取数据  1.1 定义类方法返回单例对 ...

  6. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  7. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  8. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  9. IOS开发UI基础--数据刷新

    IOS开发UI基础--数据刷新 cell的数据刷新包括下面几个方面 加入数据 删除数据 更改数据 全局刷新方法(最经常使用) [self.tableView reloadData]; // 屏幕上的全 ...

随机推荐

  1. 用root帐号切换其他帐号提示 su: warning: cannot change directory to /home/oracle: Permission denied

    用root帐号切换其他帐号提示: 出错原因: 基本上是根目录或者是/home/oracle目录权限的问题 解决办法: 更改根目录权限为755,并保证对应用户主目录的所属用户和所属组一致和用户名一致. ...

  2. 工控主板对ISO7816智能卡标准的支持

    ISO7816是一套协议标准,这套协议不仅规定了智能IC卡的机械电气特性,而且还规定了智能IC卡的应用方法.智能IC卡的主要用途可归为身份识别.支付安全.加密/解密和信息存储四个方面.智能IC卡已经广 ...

  3. 用keil直接生成BIN文件

    1.下载hex2bin到keil的任意目录,下载地址:http://www.keil.com/download/docs/7.asp 或者 http://www.hex2bin.com/files/h ...

  4. 桌面上嵌入窗口(桌面日历)原理探索(将该窗口的Owner设置成桌面的Shell 窗口,可使用SetWindowLong更改窗口的GWL_HWNDPARENT,还要使用SetWindowPos设置Z-Order)

    今天在QQ群里有人问怎样实现将自己的窗口嵌入桌面,让它和桌面融为一体,就像很多桌面日历软件那样. 我当时想到的就是建立一个Child  Window,将他的父窗口设置成桌面Shell窗口就可以了.但是 ...

  5. BZOJ2750: [HAOI2012]Road

    2750: [HAOI2012]Road Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 261  Solved: 113[Submit][Status ...

  6. 批量更新sql |批量update sql

    图所示现需要批量更新table2表内字段Pwd更新userName对IP地址username与Ip对应关系table1所示 update table2 set pwd=table1.ip from t ...

  7. dp优化简单总结

    1.二分优化 (使用二分查找优化查找效率) 典型例题:LIS dp[i]保存长度为 i 的上升子序列中最小的结尾,可以用二分查找优化到nlogn 2.数学优化 (通过数学结论减少状态数) 例题1:hd ...

  8. poj3667---Hotel 线段树区间合并,区间更新

    题意:有N个房间,M次操作.有两种操作(1)"1 a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住.(2)"2 b len",把起点为b ...

  9. MyBatis映射文件的resultMap如何做表关联

    MyBatis的核心是其映射文件,SqlMap文件,里面配置了项目中用到了什么SQL语句,和数据库相关的逻辑都在这个映射文件里.顾名思义,映射文件就是对Java对象和SQL的映射.这里简单介绍一下映射 ...

  10. Javascript:字符串分割split()妙用

    概述: split() 方法将字符串分割为字符串数组,并返回此数组 语法格式: stringObject.split(separator,limit) 参数说明: 注意:如果把空字符串 (" ...