如何清除 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 在磁盘上缓存图像?

使用 CRA React 清除缓存

如何清除tomcat缓存

如何从 AFNetworking 禁用缓存

如何知道请求是不是来自缓存或不使用 AFNetworking