iOS开发本地缓存(数据离线缓存、读取、释放)

为了节约流量,同时也是为了更好的用户体验,目前很多应用都使用本地缓存机制,其中以网易新闻的缓存功能最为出色。我自己的应用也想加入本地缓存的功能,于是我从网上查阅了相关的资料,发现总体上说有两种方法。 一种是自己写缓存的处理,一种是采用ASIHTTPRequest中的ASIDownloadCache。

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

1.保存到沙盒的代码:

 

[plain]  view plain copy
  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判断本地是否有

 

[plain]  view plain copy
  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.       
  6.     NSString *value [settings objectForKey:key];  
  7.     return value;  
  8.  

如果沙盒里面有数据

 

[plain]  view plain copy
  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.          
  14.           
  15.         [self.tableView tableViewDidFinishedLoadingWithMessage:@"数据全部加载完了.."];  
  16.         self.tableView.reachedTheEnd  YES;  

 

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

 

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

 

[plain]  view plain copy
  1. @interface AppDelegate UIResponder   
  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方法中添加如下代码

 

 

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

 

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

 

[plain]  view plain copy
  1. [myCache release];  

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

 

    2、设置缓存策略

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

 

[plain]  view plain copy
  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、清理缓存数据

 

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

 

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

 


    这里清理的是ASICachePermanentlyCacheStoragePolicy这种存储策略的缓存数据,如果更换其他的参数的话,即可清理对应存储策略的缓存数据。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
iOS 中,你可以使用以下两种方式将接口返回的数据缓存到本地: 1. 使用 NSUserDefaults 如果你的数据量比较小,可以将接口返回的数据存储到 NSUserDefaults 中。NSUserDefaults 是一个轻量级的本地存储工具,可以用来存储简单的用户配置信息和小数据量的数据。 你可以将接口返回的数据转换成 NSData 类型,然后存储到 NSUserDefaults 中。示例代码如下: ```objective-c // 将接口返回的数据转换成 NSData 类型 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject]; // 存储到 NSUserDefaults 中 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:data forKey:@"cachedData"]; [defaults synchronize]; ``` 在读取数据时,你可以使用如下代码: ```objective-c // 从 NSUserDefaults 中读取数据 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; NSData *data = [defaults objectForKey:@"cachedData"]; // 将 NSData 类型转换成 NSDictionary 类型 NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; ``` 2. 使用文件缓存 如果你的数据量比较大,可以将接口返回的数据存储到文件中。在读取数据时,你可以从文件中读取数据。示例代码如下: ```objective-c // 将接口返回的数据转换成 NSData 类型 NSData *data = [NSKeyedArchiver archivedDataWithRootObject:responseObject]; // 存储到文件中 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"cachedData"]; BOOL success = [data writeToFile:filePath atomically:YES]; if (!success) { NSLog(@"Error writing to file"); } ``` 在读取数据时,你可以使用如下代码: ```objective-c // 从文件中读取数据 NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject]; NSString *filePath = [cachePath stringByAppendingPathComponent:@"cachedData"]; NSData *data = [NSData dataWithContentsOfFile:filePath]; // 将 NSData 类型转换成 NSDictionary 类型 NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data]; ``` 注意:无论你选择哪种方式,都需要注意缓存的有效期。在读取数据时,你需要判断缓存是否过期,如果过期了,就需要重新从接口获取数据
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值