前提:后台返回的接口带etaggit
第一步github
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
方法里加入代码,也能够抽成一个方法方便调用或更多其余设置api
- (void)initCache { NSURLCache *cache = [[NSURLCache alloc] initWithMemoryCapacity:4 * 1024 * 1024 diskCapacity:20 * 1024 * 1024 diskPath:@"NSURLCache"]; [NSURLCache setSharedURLCache:cache]; }
我这里使用的是系统自带的NSURLCache,好处就是他会自动处理存,你只须要处理取就好了,可能以为系统存,会优化一点吧,缓存
固然你也能够使用性能比较好的一些第三方来存取,好比YYCache、PINCache等app
设置AFN性能
[_manager.requestSerializer setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
要是不 这样设置的话,它会一直返回200给你,固然若是大家跟后台约定了缓存失效的时间,那也能够不用看什么304,直接判断本地缓存的有效期就好了优化
而后咱们就开始加入etag,存入etag,304时从缓存取了url
if (method == RequestMethodGet) { YYCache *urlCache = [YYCache cacheWithName:@"EtagCache"]; NSString* etag = (NSString *)[urlCache objectForKey:cacheKey]; if (etag != nil){ // get时若是有etag,咱们就加入到headerField中 [_manager.requestSerializer setValue:etag forHTTPHeaderField:@"If-None-Match"]; } task = [_manager GET:api parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if ([(NSHTTPURLResponse *)task.response allHeaderFields][@"Etag"]) { // 请求成功后,若是有etag,咱们就存起来 [urlCache setObject:[(NSHTTPURLResponse *)task.response allHeaderFields][@"Etag"] forKey:cacheKey]; } respondSuccessBlock(task, responseObject); } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { if ([(NSHTTPURLResponse *)task.response statusCode] == 304) { // 返回304咱们就从缓存中取数据 NSCachedURLResponse* cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:task.currentRequest]; id responseObject = [_manager.responseSerializer responseObjectForResponse:cachedResponse.response data:cachedResponse.data error:nil]; respondSuccessBlock(task,responseObject); } else { respondErrorBlock(task, error); } }]; }