如何清除 AFNetworking 中的旧缓存?
Posted
技术标签:
【中文标题】如何清除 AFNetworking 中的旧缓存?【英文标题】:How to clear old cache in AFNetworking? 【发布时间】:2014-09-04 23:32:55 【问题描述】:我正在使用 AFNetworking 像这样加载 JSON 数据,效果很好。
SessionManager *sessionManager = [SessionManager sharedClient];
[sessionManager setResponseSerializer:[AFJSONResponseSerializer serializer]];
[sessionManager setRequestSerializer:[AFJSONRequestSerializer serializer]];
[sessionManager GET:urlString
parameters:nil
success:^(NSURLSessionDataTask *task, id responseObject)
self.navigationItem.titleView = nil;
self.data = [responseObject objectForKey:@"courses"];
self.title = responseObject[@"meta"][@"ref_title"];
[self.tableView reloadData];
failure:^(NSURLSessionDataTask *task, NSError *error)
NSString *errorString = [NSString stringWithFormat:@"%@",
[error localizedDescription]];
[aiView stopAnimating];
];
问题是我不想每次都加载数据。 所以我用了
sessionManager.requestSerializer.cachePolicy = NSURLRequestReturnCacheDataElseLoad;
这允许更快的用户体验,但现在的问题是数据永远不会被删除,或者是这样吗?所以用户可能没有意识到有更新的数据可用。
为此,我现在使用 NSTimer,它在应用程序加载时启动,然后调用
[[NSURLCache sharedURLCache] removeAllCachedResponses];
我认为这是一个非常糟糕的解决方案,因为即使数据是在 5 秒前加载的,计时器也会调用该方法。所以我问有没有更好的?
我在这里看到了一个类似的问题,但它是关于清除图像缓存的,并且与缓存的年龄无关。对我来说最好的情况是如果可以在日期更改时删除缓存。
【问题讨论】:
【参考方案1】:您是否研究过其他缓存策略? NSURLRequestReloadRevalidatingCacheData 看起来可能更适合您的需求。只有当源源确认数据仍然有效时才会使用缓存数据。
【讨论】:
是的,我也试过了,每次都会从服务器重新加载。 为避免删除 5 秒前缓存的数据,您可以使用:(void)removeCachedResponseForRequest:(NSURLRequest *)request。如果它是同一个请求,您可以有多个相同请求的实例和备用实例。【参考方案2】:我决定在应用程序 didFinishLaunchingWithOptions 中检查日期并将日期保存到 NSUserDefaults。所以对我来说,我设置了它,如果日期不匹配,我会清除所有缓存和 NSUserDefaults 中存储的值。
如果我正确理解代码,它应该只在用户在第二天启动应用程序时清除所有内容,这对我来说是完美的。
NSDate *dateCheck = [NSDate date];
NSDate *saveDate = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastStartDate"];
if (!saveDate)
// This is the 1st run of the app
saveDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:saveDate forKey:@"lastStartDate"];
NSLog(@"First run was on: %@", saveDate);
NSInteger interval = [[[NSCalendar currentCalendar] components:NSCalendarUnitDay
fromDate:saveDate
toDate:dateCheck
options:0] day];
if (interval < 0 || interval > 0)
// Dates don't match lets remove cache and delete saveDate
[self removeAllCachedResponses];
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
else
// Dates are equal no need to do anything
NSLog(@"dates are same");
如您所见,我从 NSUserDefaults 中删除了所有内容,因为我没有将它用于其他任何事情。你可能想为你改变它。
编辑: 好日子变了,所以我决定检查这是否真的有效,答案是否定的。这是我的日志
2014-09-10 16:00:30.626 SodexoMenuApp[4283:607] datecheck: 2014-09-10 21:00:30 +0000
2014-09-10 16:00:30.627 SodexoMenuApp[4283:607] First run was on: 2014-09-09 23:02:02 +0000
所以必须改变一些东西。有什么想法吗?
编辑 2: 我想我解决了这个问题。只需要更改组件:NSCalendarUnitDay
【讨论】:
以上是关于如何清除 AFNetworking 中的旧缓存?的主要内容,如果未能解决你的问题,请参考以下文章
使用Python批量删除windows下特定目录的N天前的旧文件实战:Windows下批量删除旧文件清除缓存文件解救C盘拒绝C盘爆炸
如何在巨大的 CollectionView 中使用 SDWebImage 或 AFNetworking 在磁盘上缓存图像?