iOS AFN 做缓存(如何简单的做缓存)
2016-04-11 12:45
246 查看
注意:想做缓存,一定是GET请求哦,POST请求的话你还做什么缓存啊! 前些日子,我因为不会做缓存,但是项目有需要,我就百度了很多,慢慢的对缓存有了了解。原理上明白了,但是还是不会做。我最后发现,百度到的那些是对的,就是很简单(需要我们做的很少)。 在这里我针对我做的做一下介绍(我希望得到大神的指点,毕竟我是理解而不会用AFN做,这里做的很简单)
分为三步,你可以做一个demo试试:
1、在AppDelegate.m里面做缓存的大小。(缓存时 申请运行内存4M,磁盘30M)
NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:30 * 1024 * 1024 diskPath:nil]; [NSURLCache setSharedURLCache:cache];
2、检测网络状态。(有人会问,监测网络状态干啥?)我这里实现的思路是这样的:通过检测网络状态,从而设置缓存策略。 在AppDelegate.h
@property (nonatomic,assign)NSInteger networkStatus;//网络状态
在AppDelegate.m
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager]; [mgr setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusUnknown: // 未知网络 self.networkStatus = ZPAFNetworkReachabilityStatusUnknown; [[NSNotificationCenter defaultCenter] postNotificationName:@"isHaveNetWorkRefreshHomeCtrl" object:nil]; break; case AFNetworkReachabilityStatusNotReachable: // 没有网络(断网) self.networkStatus = ZPAFNetworkReachabilityStatusNotReachable; break; case AFNetworkReachabilityStatusReachableViaWWAN: // 手机自带网络 self.networkStatus = ZPAFNetworkReachabilityStatusReachableViaWWAN; [[NSNotificationCenter defaultCenter] postNotificationName:@"isHaveNetWorkRefreshHomeCtrl" object:nil]; break; case AFNetworkReachabilityStatusReachableViaWiFi:// WIFI self.networkStatus = ZPAFNetworkReachabilityStatusReachableViaWiFi; [[NSNotificationCenter defaultCenter] postNotificationName:@"isHaveNetWorkRefreshHomeCtrl" object:nil]; break; default: break; } }]; [mgr startMonitoring];
在这里注意,因为第一次 检测网络需要时间,而此时你可能也需要请求(用到了缓存)此时的网络状态可能还没检测到,你接下来所设置的 缓存策略 可能就不合你意了。所以加这行代码(有更好的办法 请告诉我)
//启动界面延时 [NSThread sleepForTimeInterval:3.0];
3、在你自己封装的网络请求类里面 (看看根据网络状态,而设置不同的 缓存策略)
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSInteger netStatus = appDelegate.networkStatus; switch (netStatus) { case ZPAFNetworkReachabilityStatusUnknown: [manager.requestSerializer setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; break; case ZPAFNetworkReachabilityStatusNotReachable: [manager.requestSerializer setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; break; case ZPAFNetworkReachabilityStatusReachableViaWWAN: [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringCacheData]; break; case ZPAFNetworkReachabilityStatusReachableViaWiFi: [manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringCacheData]; break; default: // [manager.requestSerializer setCachePolicy:NSURLRequestReturnCacheDataDontLoad]; break; }
最后你再试试,看看当不同网络的时候是不是 缓存策略就会不同,而因为缓存策略不同AFN的反应就不一样。在有缓存无网络的情况下,它会根据 键值对 取出 此请求对应的缓存数据。基本上可以达到你的缓存需求。但是优化是一定的,请求超时怎么办?在没有网络时突然连上网时应该做什么操作 用户体验才会好。那就需要你自己根据自己的需要做了。 当然,如果你有更好的方法,也行告诉我。我的qq:693552568
相关文章推荐
- 如何在Xcode中将软件调整为Release
- iOS中RSA加密详解
- iOS之带有边框的圆形图片裁剪
- 谷歌广告sdk—iOS版本
- ios推送之远程推送
- iOS内功篇:内存管理
- iOS动态计算Label的宽高
- <iOS>cannot be opened because the project file cannot be parsed. Xcode工程文件打不开..
- IOS中输入框被软键盘遮挡的解决办法
- 手机号判断
- iOS各层级主要框架介绍
- iOS 支持最新版本调试的文件路径备忘录
- iOS SDWebImage源码研究(三)
- ios后台长时间运行
- 三目运算iOS
- GCD 多线程 ---的记录 iOS
- <iOS> The operation could not be performed because of one or more tree conflicts.
- 保持iOS设备屏幕常亮的方法
- ios深拷贝,浅拷贝,拷贝自定义对象的简单介绍
- iOS 修改导航栏的返回按钮的内容