更新Parse iOS本地数据存储区

时间:2015-03-05 00:01:19

标签: ios parse-platform local datastore pfquery

我正在为iPhone创建游戏,主屏幕是当前用户正在进行的游戏列表。我想使用解析本地数据存储区,因为当有很多游戏正在进行时,我的查询需要很长时间。我有一个关于数据存储区的问题,似乎没有在文档中清楚地回答。

当应用程序打开时,我在后台查询我的游戏表,根据状态(轮到你,轮到他们)对它们进行排序,并将它们显示在表格中。为了加快这个过程,我想将所有这些对象都固定到本地数据存储区。

当用户刷新tableview以查看是否有任何游戏状态发生变化时,我想查询数据存储区以检索所有相关对象,但是还要查询网络中的任何更改在对象中,对于任何新对象。但是,似乎无论如何都无法使本地数据存储“更新”。我看到的唯一方法是完全查询网络,取消固定当前存储的对象,并固定新检索的对象。如果是这种情况,我没有看到使用本地数据存储区的重点,因为我的查询速度一样慢。

基本上,每次用户拉动刷新表时,我都希望查询数据存储区,然后检查网络以检查是否有新对象或更改了列。

那么,有没有办法查询本地数据存储区并随后更新这些对象和/或从网络中添加新对象?

我也意识到我正在进行相当多的排序。这会对表加载的漫长等待时间产生影响吗?

1 个答案:

答案 0 :(得分:1)

您似乎正在寻找缓存策略kPFCachePolicyCacheThenNetwork,它首先查找缓存以填充表,然后再对网络执行查询,然后再次刷新表。

请注意,cachePolicy只能在没有本地数据存储的情况下使用。如果您想使用本地数据存储,则可以通过链接查询来实现相同的功能。

PFQuery *queryLocal = [PFQuery queryWithClassName:@"SomeClass"];
[queryLocal fromPinWithName:@"SomeLabel"];
[[[queryLocal findObjectsInBackground] continueWithSuccessBlock:^id(BFTask *task) {
    NSArray *localObjects = task.result;
    // Fill the table here with localObjects

    // Then make an online query
    PFQuery *query = [PFQuery queryWithClassName:@"SomeClass"];
    return [query findObjectsInBackground];

}] continueWithSuccessBlock:^id(BFTask *task) {
    NSArray *objects = task.result;
    // Fill the table here with online objects
    // You should ensure that the most recent data is online

    return [[PFObject unpinAllObjectsInBackgroundWithName:@"SomeLabel"] continueWithSuccessBlock:^id(BFTask *ignored) {
        // Cache the new results.
        return [PFObject pinAllInBackground:objects withName:@"SomeLabel"];
    }];
}];