Xcode 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

我正在使用Parse.com作为后端编写一个iOS应用程序

在我的
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的缓存。以下是一个解决方法:

  • 不在viewDidLoad查询NSDate
  • 但是在视图中执行它
  • 守则:

    - (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对接收方是敏感的,从上次执行查询时起,接收方保持不变。设置更改的时间(总是会生成该时间)会更改标准,因此会更改结果,并且可以公平地假设,会使缓存无效。