可以解析缓存替换核心数据

时间:2013-10-12 05:47:00

标签: ios parse-platform

我正在使用CRUD函数构建一个简单的联系人目录,我希望脱机编辑功能。我的联系人数据库将存储在Parse.com后端。使用Parse缓存功能是否可以实现,或者使用Core Data会更好吗?

3 个答案:

答案 0 :(得分:21)

不,它不能。 Parse只是简单地缓存查询结果。这是非常有限的,与缓存所有PFObject不同。例如,假设您对所有“联系人”PFObjects运行了查询。您可以对缓存执行的唯一操作是稍后再次运行完全相同的查询(并获得完全相同的结果)。您甚至无法查询该缓存数据的子集。

另一个问题是,当用户对PFObject进行的任何更改时,缓存的对象都不会更新。例如,假设用户正在离线编辑联系人,并且您的代码正在调用saveEventually以尽可能将这些更改保存到Parse。当您获得缓存的查询结果时,用户的更改将不会反映在您的PFObject中。对于已删除和添加的PFObject,我相信也是如此。这会使离线使用变得非常糟糕。以下是Parse论坛中涉及此主题的帖子:

https://www.parse.com/questions/does-saving-an-object-supposed-to-update-the-local-cache-of-a-query-on-these-objects

我见过Parse开发人员提到未来某些时候Parse对象的改进缓存。但是,此功能尚不存在,并且不知道何时会出现。同时,如果要支持脱机使用,则必须使用Core Data或其他本地存储。 FTASync(我从未使用过)用于将Parse对象与Core Data同步:

https://github.com/itsniper/FTASync

您也可以编写自己的代码来同步两组数据。

答案 1 :(得分:6)

Parse iOS / OSX SDK提供了一个本地数据存储区,可用于存储和检索PFObject,即使在网络不可用时也是如此。要启用此功能,请在调用setApplicationId之前添加libsqlite3.dylib并调用[Parse enableLocalDatastore]:clientKey:。

the Parse documentation中所述:

  

您可以通过固定PFObject将PFObject存储在本地数据存储中。钢钉   PFObject是递归的,就像保存一样,所以任何对象都是   你固定的那个指向也会固定。当一个   每次通过提取或保存新内容来更新对象时都会固定对象   数据,本地数据存储区中的副本将自动更新。   你根本不需要担心它。

PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = 1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore pinInBackground];
     

如果您有多个对象,可以使用   pinAllInBackground便捷方法。

[PFObject pinAllInBackground:listOfObjects];
     

从本地数据存储中检索对象就像   通过网络检索一个。唯一的区别就是打电话给   fromLocalDatastore方法告诉PFQuery在哪里寻找它   结果

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query fromLocalDatastore];
[[query getObjectInBackgroundWithId:@"xWMyZ4YE"] continueWithBlock:^id(BFTask *task) {
  if (task.error) {
    // Something went wrong.
    return task;
  }

  // task.result will be your game score
  return task;
}];
     

任何PFQuery都可以与本地数据存储一起使用   网络。结果将包括您固定的任何对象   匹配查询。您对该对象所做的任何未保存的更改   将在评估查询时考虑。所以你可以找到一个当地的   匹配的对象,即使它从未从服务器返回   这个特殊的问题。

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query fromLocalDatastore];
[query whereKey:@"playerName" equalTo:@"Joe Bob"];
[[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) {
  if (task.error) {
    NSLog(@"Error: %@", task.error);
    return task;
  }

  NSLog(@"Retrieved %d", task.result.count);
  return task;
}];
     

当你完成一个对象并且不再需要它在   本地数据存储区,您可以简单地解除它。

[gameScore unpinInBackground];
     

还有一种方法可以同时取消固定几个对象。

[PFObject unpinAllInBackground:listOfObjects];

有关使用Parse本地数据存储区的更多信息,请在解析的网站上查看为iOS / OSX提供的本地数据存储区文档。

答案 2 :(得分:1)

不,不能。我不建议https://github.com/itsniper/FTASync