Parse.com查询:缓存始终为空(iOS)

时间:2015-03-15 12:42:50

标签: xcode object caching parse-platform pfquery

我正在使用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]

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

感谢您的帮助,如果我能为您提供更多信息,请告知我们。

2 个答案:

答案 0 :(得分:0)

代码使用条件if (self.objects.count == 0)保护缓存策略的设置。在零对象和查询成功后不使用缓存时,您似乎正在使用缓存。由于默认情况下不使用缓存,因此代码将永远不会使用它。

只需删除条件,或在[query hasCachedResult]

上有条件地使用缓存

编辑 - 仍然可以/应该无条件地设置缓存策略,但只有在查找后其条件不会发生变化时,查询才能拥有hasCachedResults(我不知道& #39;在文档中看到一个确认这一点的地方,但这是有道理的)。为确保查询可以返回缓存结果,请在查找后保持其条件不变。

答案 1 :(得分:0)

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

  1. 不在viewDidLoad
  2. 查询NSDate
  3. 但是在viewDidAppear
  4. 中执行

    代码:

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