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

All*_*len 16 ios parse-platform

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

Ale*_*lex 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

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

  • 那里涉及很多工作,不是吗!如果Parse缓存允许更精细的粒度控制,那么我认为它可能会取代许多应用程序对Core Data的需求. (2认同)

Yup*_*up. 6

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

Parse文档中所述:

您可以通过固定PFObject将PFObject存储在本地数据存储中.固定PFObject是递归的,就像保存一样,因此您固定的对象所指向的任何对象也将被固定.固定对象时,每次通过提取或保存新数据进行更新时,本地数据存储区中的副本都将自动更新.您根本不需要担心它.

PFObject *gameScore = [PFObject objectWithClassName:@"GameScore"];
gameScore[@"score"] = 1337;
gameScore[@"playerName"] = @"Sean Plott";
gameScore[@"cheatMode"] = @NO;
[gameScore pinInBackground];
Run Code Online (Sandbox Code Playgroud)

如果您有多个对象,可以使用pinAllInBackground方便方法将它们全部固定.

[PFObject pinAllInBackground:listOfObjects];
Run Code Online (Sandbox Code Playgroud)

从本地数据存储区检索对象就像通过网络检索对象一样.唯一的区别是调用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;
}];
Run Code Online (Sandbox Code Playgroud)

任何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;
}];
Run Code Online (Sandbox Code Playgroud)

当您完成一个对象并且不再需要它在本地数据存储区中时,您可以简单地取消它.

[gameScore unpinInBackground];
Run Code Online (Sandbox Code Playgroud)

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

[PFObject unpinAllInBackground:listOfObjects];
Run Code Online (Sandbox Code Playgroud)

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