您的位置:首页 > 移动开发 > IOS开发

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: