如何在AFNetworking中清除旧缓存?

时间:2014-09-04 23:32:56

标签: json caching afnetworking-2

我正在使用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,它在app加载后启动,然后调用

[[NSURLCache sharedURLCache] removeAllCachedResponses];

我认为这是非常糟糕的解决方案,因为即使数据在5秒前加载,计时器也会调用该方法。所以我问有什么更好的吗?

我在这里看到了类似的问题,但它是关于清除图像缓存的,并且没有任何关于缓存的年龄。对我来说最好的情况是,当白天改变时可以删除缓存。

2 个答案:

答案 0 :(得分:0)

您是否考虑过其他缓存政策? NSURLRequestReloadRevalidatingCacheData看起来可能更适合您的需求。如果源源确认数据仍然有效,它将仅使用缓存数据。

答案 1 :(得分:0)

好吧,我决定在应用程序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