2014-09-04 84 views
1

我正在使用AFNetworking来获取这样的JSON数据,这很好。如何清除AFNetworking中的旧缓存?

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方法几秒钟前。所以我问有没有更好的?

我在这里看到了类似的问题,但它是关于清除图像缓存,并没有关于缓存的年龄。对我来说最好的例子是,如果缓存可能会在日期发生变化时被删除。

回答

0

你看过其他缓存策略吗? NSURLRequestReloadRevalidatingCacheData看起来可能更适合您的需求。如果原始来源确认数据仍然有效,它将仅使用缓存数据。

+0

是的我也试过,它每次都从服务器重新加载。 – Pahnev 2014-09-05 00:02:40

+0

要避免移除5秒钟前缓存的数据,可以使用:(void)removeCachedResponseForRequest:(NSURLRequest *)请求。如果是同一个请求,则可以有多次相同请求和备用实例。 – Kerstin 2014-09-05 00:30:39

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