Parse.com查询:缓存总是空(IOS)(Parse.com Query: Cache is a

2019-10-22 06:21发布

我使用Parse.com作为后端写在iOS应用内广告。

- (PFQuery)queryForTable我的方法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;

}

[query hasCachedResults]总是返回在这种情况下错误的。

在另一类,我做的是几乎完全一样的查询(在不同的解析级),它会自动缓存。 唯一不同的是,这等查询包含PFFiles

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

感谢您的帮助,让我知道,如果我可以给你更多的信息。

Answer 1:

该代码守卫高速缓存策略的一个条件设置if (self.objects.count == 0) 这似乎是你正在使用的缓存时有为零的对象,而不是使用它的查询成功后。 由于默认是不使用高速缓存,代码被设置为从不使用它。

只是删除条件,或在有条件使用缓存[query hasCachedResult]

编辑 -它仍然是高速缓存策略可/应无条件地设置的情况下,但查询可以hasCachedResults只有当它的标准不查找后修改(我看不出在这个文档确认这个地方,但按理说)。 为了确保查询可返回缓存的结果,离开其标准查找后保持不变。



Answer 2:

在[NSDate的日期]避免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];
}


文章来源: Parse.com Query: Cache is always empty (iOS)