分类: 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. CentOS7配置Nodejs环境安装记录

    今天购买了阿里云服务器,系统选的是CentOS7,下面记录下在它上面安装Nodejs环境的过程,本次操作是直接连接的阿里云服务器的管理终端. 1.由于是纯净的环境,先通过以下命令安装nodejs编译及 ...

  2. BZOJ1532: [POI2005]Kos-Dicing

    1532: [POI2005]Kos-Dicing Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1060  Solved: 321[Submit][St ...

  3. NOI2011 兔农

    http://www.lydsy.com/JudgeOnline/problem.php?id=2432 感觉是day1中最难的一题,还好出题人很良心,给了75分部分分. 还是跪拜策爷吧~Orz ht ...

  4. 【转】修改Android工程的名称、安装路径

    申明:转载自:http://blog.csdn.net/hcj116/article/details/21712353 在Google提供的Eclipse集成开发环境adt-bundle下修改名称的总 ...

  5. poj 2184 Cow Exhibition(dp之01背包变形)

    Description "Fat and docile, big and dumb, they look so stupid, they aren't much fun..." - ...

  6. js基础例子购物车升级版(未优化版)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  7. PyCharm 4.0下载(附keygen)

    百度网盘:http://pan.baidu.com/s/1nvAdEM9  密码:xfz9

  8. jquery压缩图片插件

    imageCompress 只有图片压缩功能,比较简单jquery.imageCompress.js 使用说明: el:为上传框 quality:压缩图片质量,单位为% onloadStart:读取图 ...

  9. 多路复用I/O poll()

    1.基本知识 poll的机制与select类似,与select在本质上没有多大差别,管理多个描述符也是进行轮询,根据描述符的状态进行处理,但是poll没有最大文件描述符数量的限制.poll和selec ...

  10. Picasso – Android系统的图片下载和缓存类库

    Picasso – Android系统的图片下载和缓存类库 Picasso 是Square开源的一个用于Android系统下载和缓存图片的项目.该项目和其他一些下载图片项目的主要区别之一是:使用4.0 ...