我正在为iPhone创建游戏,主屏幕是当前用户正在进行的游戏列表。我想使用解析本地数据存储区,因为当有很多游戏正在进行时,我的查询需要很长时间。我有一个关于数据存储区的问题,似乎没有在文档中清楚地回答。
当应用程序打开时,我在后台查询我的游戏表,根据状态(轮到你,轮到他们)对它们进行排序,并将它们显示在表格中。为了加快这个过程,我想将所有这些对象都固定到本地数据存储区。
当用户刷新tableview以查看是否有任何游戏状态发生变化时,我想查询数据存储区以检索所有相关对象,但是还要查询网络中的任何更改在对象中,对于任何新对象。但是,似乎无论如何都无法使本地数据存储“更新”。我看到的唯一方法是完全查询网络,取消固定当前存储的对象,并固定新检索的对象。如果是这种情况,我没有看到使用本地数据存储区的重点,因为我的查询速度一样慢。
基本上,每次用户拉动刷新表时,我都希望查询数据存储区,然后检查网络以检查是否有新对象或更改了列。
那么,有没有办法查询本地数据存储区并随后更新这些对象和/或从网络中添加新对象?
我也意识到我正在进行相当多的排序。这会对表加载的漫长等待时间产生影响吗?
答案 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"];
}];
}];