【问题标题】:Parse.com Query: Cache is always empty (iOS)Parse.com 查询:缓存始终为空(iOS)
【发布时间】:2015-03-15 12:42:50
【问题描述】:

我正在编写一个使用 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。

在另一个类中,我正在执行几乎完全相同的查询(在不同的 Parse-Class 上)并且它会自动缓存。唯一的区别是,这个其他查询包含PFFiles。

这可能是一个愚蠢的问题,但我已经坚持了好几天了。

感谢您的帮助,如果我可以为您提供更多信息,请告诉我。

【问题讨论】:

    标签: xcode object caching parse-platform pfquery


    【解决方案1】:

    代码使用条件if (self.objects.count == 0) 保护缓存策略的设置。当对象为零时,您似乎正在使用缓存,而在查询成功后不使用它。由于默认是不使用缓存,所以代码被安排成从不使用。

    只需删除条件,或根据[query hasCachedResult] 有条件地使用缓存

    编辑 - 仍然可以/应该无条件设置缓存策略,但是只有在查找后其条件不变时,查询才能具有 hasCachedResults(我没有在文档中看到一个地方证实了这一点,但这是有道理的)。为确保查询可以返回缓存结果,请在查找后保持其条件不变。

    【讨论】:

    • 感谢您的回答!我已经尝试过并触发了几次查询,但缓存仍然是空的,即使没有条件。
    • 嗯。抱歉,它没有用。作为调试步骤,尝试实现 objectsDidLoad 并在那里询问 [[self queryForTable] hasCachedResult]。如果那是错误的(当您无条件地设置 cachePolicy 时),那么这很有趣。下一个想法是将整个事情从 PFQueryTable VC 中拉出来,看看你是否可以在那里重现。也许他们的自定义 VC 会干扰查询或缓存。
    • 经过进一步考虑,我更喜欢我的第二个想法。自定义表格视图控制器提供的“便利”结果证明是一种令人讨厌的不便,这也不是第一次了。
    • objectsDidLoad 中的 [[self queryForTable] hasCachedResult] 也是错误的。奇怪的是,我有三个 PFQueryTableVC: 在第一个中,我从不设置 cachePolicy,但即使我在每次查询后清除现金,在再次清除它之前它总是有 cachedResults。第二个和第三个将 cachePolicy 设置为 kPFCachePolicyCacheThenNetwork 但缓存始终保持为空。这两个 VC 和第一个 VC 之间唯一真正的区别是他们调用[query whereKey:@"date" greaterThanOrEqualTo:[NSDate date]];。使用当前日期会导致问题吗?
    • 啊。这是一个很好的线索。从上次执行查询时起,hasCachedResults 对接收者未更改 很敏感,这是有道理的。设置更改的时间([NSDate date] 将始终生成)将更改标准,因此更改结果,并且可以公平地假设使缓存无效。
    【解决方案2】:

    [NSDate date] 避免了 PFQuery 的缓存。这是一个解决方法:

    1. 不要在 viewDidLoad 查询 NSDate
    2. 但在 viewDidAppear 中进行

    代码:

    - (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];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-05
      • 2017-05-07
      • 2014-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多