我正在使用Parse.com作为后端编写iOS应用程序。
在我- (PFQuery)queryForTable
的{{1}}方法中,我从Parse中检索一组数据,但我无法缓存此查询以便在设备支持功能时目前处于离线状态。
该方法如下:
PFQueryTableViewController
在这种情况下, - (PFQuery *)queryForTable {
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
[query whereKey:@"city" equalTo:[[NSUserDefaults standardUserDefaults] objectForKey:@"city"]];
// userMode is active when a user is logged in and is about to edit coins
if (self.userModeActive) {
[query whereKey:self.textKey equalTo:self.user[@"location"]];
}
// dateFilter is active when view is pushed from an event
if (self.dateFilterActive) {
[self createDateRangeForFilter];
[query whereKey:@"date" greaterThan:[[self createDateRangeForFilter] objectAtIndex:0]];
[query whereKey:@"date" lessThan:[[self createDateRangeForFilter] objectAtIndex:1]];
} else {
// Add a negative time interval to take care of coins when it's after midnight
[query whereKey:@"date" greaterThanOrEqualTo:[[NSDate date] dateByAddingTimeInterval:-(60 * 60 * 6)]];
[query orderByAscending:self.dateKey];
}
// locationFilter is active when view is pushed from a location profile
if (self.locationFilterActive) {
[query whereKey:@"location" equalTo:self.locationToFilter];
}
// If no objects are loaded in memory, look to the cache first to fill the table
// and then subsequently do a query against the network.
if (self.objects.count == 0) {
query.cachePolicy = kPFCachePolicyCacheThenNetwork;
}
if ([query hasCachedResult]) {
NSLog(@"hasCache");
} else {
NSLog(@"chache empty");
}
return query;
}
总是返回false。
在另一个类中,我执行几乎完全相同的查询(在不同的Parse-Class上)并自动缓存。唯一的区别是,此其他查询包含[query hasCachedResults]
。
这可能是一个愚蠢的问题,但我现在已经坚持了几天。
感谢您的帮助,如果我能为您提供更多信息,请告知我们。
答案 0 :(得分:0)
代码使用条件if (self.objects.count == 0)
保护缓存策略的设置。在零对象和查询成功后不使用缓存时,您似乎正在使用缓存。由于默认情况下不使用缓存,因此代码将永远不会使用它。
只需删除条件,或在[query hasCachedResult]
编辑 - 仍然可以/应该无条件地设置缓存策略,但只有在查找后其条件不会发生变化时,查询才能拥有hasCachedResults(我不知道& #39;在文档中看到一个确认这一点的地方,但这是有道理的)。为确保查询可以返回缓存结果,请在查找后保持其条件不变。
答案 1 :(得分:0)
[NSDate date]避免PFQuery的缓存。这是一个解决方法:
代码:
- (PFQuery *)queryForTable {
PFQuery *query = [PFQuery queryWithClassName:self.parseClassName];
// 1. load from cache only when viewDidLoad
// setup query WITHOUT NSDate "where" condition
if (self.shouldQueryToNetwork) {
// 2. update objects with date condition only when view appeared
[query whereKey:@"date" greaterThan:[NSDate date]];
}
return query;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
self.shouldQueryToNetwork = YES;
// Sync objects with network
[self loadObjects];
}