我正在使用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秒前加载,计时器也会调用该方法。所以我问有什么更好的吗?
我在这里看到了类似的问题,但它是关于清除图像缓存的,并且没有任何关于缓存的年龄。对我来说最好的情况是,当白天改变时可以删除缓存。
答案 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