Ios PFQuery缓存始终为空

Ios PFQuery缓存始终为空,ios,objective-c,caching,parse-platform,pfquery,Ios,Objective C,Caching,Parse Platform,Pfquery,我正在将PFQuery对象的缓存策略设置为kPFCachePolicyCacheThenNetwork,但缓存始终为空。有人能帮我弄清楚发生了什么事吗 下面的代码始终返回空的缓存结果 -(void)doSomeQuery { PFQuery *query = [PFQuery queryWithClassName:kMySpecialClass]; [query whereKey:kDateExpires greaterThan:[NSDate date]]; query.ca

我正在将PFQuery对象的缓存策略设置为
kPFCachePolicyCacheThenNetwork
,但缓存始终为空。有人能帮我弄清楚发生了什么事吗

下面的代码始终返回空的缓存结果

-(void)doSomeQuery
{
   PFQuery *query = [PFQuery queryWithClassName:kMySpecialClass];
   [query whereKey:kDateExpires greaterThan:[NSDate date]];
   query.cachePolicy = kPFCachePolicyCacheThenNetwork;
   NSLog(@"CACHED ? =  %i",[query hasCachedResult]);//Nope, no matter what returns NO
   [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {


    NSLog(@"RETURNED: %@", objects);//1st cache (null) then network gets the data

  }];

}

根据文档,kPFCachePolicyCacheThenNetwork不应第一次从缓存返回。它应该在返回之前第一次进入网络。你可能有坏的缓存数据或其他什么

  • 您还可以确认查询在未设置cachePolicy的情况下返回正常吗

  • 另一个选项是尝试从设备中删除应用程序并再次运行,以便清除缓存。以防设备上的错误缓存数据出现任何问题


为了缓存结果,查询需要匹配(或等于)缓存结果的较早查询。问题中发布的查询每次都不同,因为它由
[NSDate]
限定

为确保查询具有缓存结果,请保留相同的
PFQuery
对象。如果您设置了kPFCachePolicyCacheThenNetwork,并运行“查找…”。。。第二次,您将得到一个缓存结果

编辑- 解决这个问题取决于系统对时间的敏感程度。让我们把这个查询理解为:给我MySpecialClass的未过期实例,其中未过期表示将来过期

让我们以本地缓存的使用为例,我有时需要快速查询和/或脱机操作,并且我愿意交换与服务器上的内容相关的事实(也许服务器不会经常获得MySpecialClass的新实例)

在一定程度上,您可以通过使用两种类型的查询来解决OP问题:

1) 一个刷新查询,执行频率较低,它会清除缓存并从服务器获取最新的未过期内容。此查询的实现与OP代码中的实现完全相同,但使用默认的缓存策略:仅网络

2) 更频繁地执行的维护查询依赖于缓存,但运行速度快且离线。这个查询仍然希望省略我的特殊类的过期实例,但我们在查询后的代码中这样做。将此查询实现为一个持续存在的属性(至少在执行期间,可能在执行之间,但这是另一个主题),然后按如下方式使用缓存和网络:

@property (strong) PFQuery *maintenanceQuery;

// lazily init
- (PFQuery *)maintenanceQuery {
    if (!_maintenanceQuery) {
       // op code, including cachePolicy = kPFCachePolicyCacheThenNetwork;
    }
    return _maintenanceQuery;
}

// based on some timing decision, either run the refresh query or...
- (void)runMaintenanceQuery:(void (^)(NSArray *, NSError *))completion {
    [self.maintenanceQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        NSDate *now = [NSDate date];
        NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(PFObject *mySpecialInstance, NSDictionary *bind){
            NSDate *expiration = [mySpecialInstance valueForKey:kDateExpires];
            return now == [expiration earlierDate:now];
        }];

        NSArray *unexpired = [objects filteredArrayUsingPredicate:predicate];
        completion(unexpired, error);
    }];
}

cache-then-network特性的优点在于,在连接的情况下,您的维护查询仍然与服务器保持相对最新的状态,因为在查询之后,如果可能的话,会以静默方式进行真正的查询,并出现新的实例。当然,有些会过期,因为时间在向前推进,但我们会在之后使用内存中的过滤器处理这些问题。

感谢您的响应,但它会首先从缓存返回,然后从网络返回,如他们的文档中所述。查询始终返回,但缓存将为空。CacheThenNetwork:查询首先从缓存加载,然后从网络加载。在这种情况下,回调实际上会被调用两次——首先是缓存结果,然后是网络结果。谢谢@danh,有什么解决方法吗?本地数据除外storage@fzkl-当然。回答起来不太简单,但我做到了最好。