Xcode Parse.com查询:缓存始终为空(iOS)
我正在使用Parse.com作为后端编写一个iOS应用程序 在我的Xcode Parse.com查询:缓存始终为空(iOS),xcode,object,caching,parse-platform,pfquery,Xcode,Object,Caching,Parse Platform,Pfquery,我正在使用Parse.com作为后端编写一个iOS应用程序 在我的PFQueryTableViewController的-(PFQuery)queryForTable方法中,我正在从Parse中检索一组数据,但我无法缓存此查询以支持设备当前脱机时的功能 方法如下所示: - (PFQuery *)queryForTable { PFQuery *query = [PFQuery queryWithClassName:self.parseClassName]; [query whereKey:@"c
PFQueryTableViewController
的-(PFQuery)queryForTable
方法中,我正在从Parse中检索一组数据,但我无法缓存此查询以支持设备当前脱机时的功能
方法如下所示:
- (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;
}
[query hasCachedResults]
在这种情况下总是返回false
在另一个类中,我正在执行几乎完全相同的查询(在不同的解析类上),它会自动缓存。唯一的区别是,另一个查询包含PFFiles
这可能是一个愚蠢的问题,但我已经坚持了好几天了
谢谢您的帮助,如果我能给您提供更多信息,请告诉我。代码使用条件
if(self.objects.count==0)
保护缓存策略的设置。看起来您在没有对象的情况下使用缓存,而在查询成功后不使用缓存。由于默认情况下不使用缓存,因此代码被安排为从不使用缓存
只需删除条件,或在[query hasCachedResult]
编辑-缓存策略仍然可以/应该无条件设置,但只有在查询的条件在查找后没有更改的情况下,查询才能具有hasCachedResults(我在文档中没有看到确认这一点的位置,但这是有道理的)。为了确保查询可以返回缓存的结果,请在查找后保持其条件不变。NSDate]避免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];
}
谢谢你的回答!我已经尝试过了,并触发了几次查询,但是缓存仍然是空的,即使没有条件。嗯。对不起,没用。作为调试步骤,请尝试实现ObjectsIDLoad,并询问那里是否有
[[self queryForTable]hasCachedResult]
。如果这是错误的(当您无条件地设置cachePolicy时),那么这非常有趣。下一个想法是从PFQueryTable VC中取出整个内容,看看是否可以在那里复制。也许他们的自定义VC干扰了查询或缓存。进一步考虑后,我更喜欢我的第二个想法。而且,自定义表视图控制器提供的“便利性”也不是第一次成为令人讨厌的不便。ObjectsIDLoad中的[[self-queryForTable]hasCachedResult]
也是错误的。奇怪的是,我有三个pQueryTableVCs:在第一个中,我从未设置cachePolicy,但即使我在每次查询后清除现金,在再次清除之前,它也总是有CacheResults。第二个和第三个选项将cachePolicy设置为kPFCachePolicyCacheThenNetwork
,但缓存始终保持为空。这两个风投与第一个风投之间唯一的真正区别在于,它们调用[query whereKey:@“date”大于或等于[NSDate date]]代码>。使用当前日期会导致问题吗?啊。这是一个很好的线索。毫无疑问,hasCachedResults对接收方是敏感的,从上次执行查询时起,接收方保持不变。设置更改的时间(总是会生成该时间)会更改标准,因此会更改结果,并且可以公平地假设,会使缓存无效。