注意:想做缓存,一定是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