我正在使用CRUD函数构建一个简单的联系人目录,我希望脱机编辑功能。我的联系人数据库将存储在Parse.com后端。使用Parse缓存功能是否可以实现,或者使用Core Data会更好吗?
答案 0 :(得分:21)
不,它不能。 Parse只是简单地缓存查询结果。这是非常有限的,与缓存所有PFObject不同。例如,假设您对所有“联系人”PFObjects运行了查询。您可以对缓存执行的唯一操作是稍后再次运行完全相同的查询(并获得完全相同的结果)。您甚至无法查询该缓存数据的子集。
另一个问题是,当用户对PFObject进行的任何更改时,缓存的对象都不会更新。例如,假设用户正在离线编辑联系人,并且您的代码正在调用saveEventually
以尽可能将这些更改保存到Parse。当您获得缓存的查询结果时,用户的更改将不会反映在您的PFObject中。对于已删除和添加的PFObject,我相信也是如此。这会使离线使用变得非常糟糕。以下是Parse论坛中涉及此主题的帖子:
我见过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:。
您可以通过固定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