在Parse和localDataStore之间同步

时间:2015-01-22 00:05:47

标签: ios cocoa parse-platform pfquery

使用'enableLocalDataStore'时,我无法将本地数据与Parse数据同步。如果我不使用本地存储一切都很好,但我想尽量减少对Parse服务器的调用。据我所知,如果我对新创建的对象使用'saveaveEventually',它们将在本地持续(固定)并在互联网连接可用时与Parse同步。这也很好。我的问题是我不知道使用Parse'dataStore'更新本地'dataStore'的最佳方法,除了调用一个远程获取更改并在本地更新的方法。目前,请使用以下内容:

-(void) fetchAllFavorites{
  PFQuery *query = [PFQuery queryWithClassName:@"UserStats"];
  [query fromLocalDatastore];

  [[query findObjectsInBackground] continueWithBlock:^id(BFTask *task) {
      if (task.error) {
      }
      else
      {
           [PFObject pinAll:task.result];  
      }
      return task.result;
  }];
} 

此方法不考虑Parse'dataStore'中可能发生的更改。我可以通过直接调用方法来取消固定所有本地对象并获取Parse中的任何内容。但是,我认为有一种更好的方法可以将本地更改与Parse'dataStore'中的更改无缝地同步?难道这不是允许首先使用'localDataStore'的想法吗?目前,我只能看到这种方式有一种方式:您在本地存储数据,然后手动更新Parse'dataStore',但您并不真正在这些之间同步。至少这是我从某些of the examples获得的想法,我想知道是否有人有一个很好的方法如何:如何启用与Parse'dataStore'持续同步的'localDataStore'?任何建议和例子都会非常有帮助。我在Cocoa编程,但Java示例也很棒。谢谢,T。

2 个答案:

答案 0 :(得分:2)

我的解决方案是进行本地查询,如果没有,则查询服务器。在我的设置页面中,我有一个"同步"与服务器,基本上完全刷新固定对象。这不是必要的,因为只要用户编辑,删除或添加对象,我就会调用saveEventuallydeleteEventuallypinInBackgroundunpinInBackground,适当。我的启动功能看起来像这样。如果找不到本地对象,则会查询服务器并将其固定,以便下次只能是本地对象。

PFQuery *localQuery = [PFQuery queryWithClassName:@"ClassName"];
[localQuery fromLocalDatastore]; // and any other constraints
[localQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if(objects.count > 0) {
        self.objects = objects;
    } else {
        PFQuery *remoteQuery = [PFQuery queryWithClassName:@"ClassName"];
        [remoteQuery findObjectsInBackground:^(NSArray *objects, NSError *error) {
            if (objects) {
                self.objects = objects;
                [PFObject pinAllInBackground:objects];
            }
        }];
    }
}];

答案 1 :(得分:0)

我的方法是编写一个实用程序,检查云中是否更新或删除了某些内容。我每次需要做更新时都会打电话:

[[ParseLocalDataStoreManager sharedInstance]updateClasses:classes];
//classes is a NSArray

我一直在跟踪哪些类已经在localStore中,哪些不是。如果没有一个类,那么我查询并固定其所有对象。如果是,我只更新了在我更新的最后一个日期之后在云中修改的对象。我使用了Parse的

[query whereKey:@"updatedAt" greaterThanOrEqualTo:lastUpdated];

并在'NSUserDefaults'中记录lastUpdated

要删除不再存在于云中的对象,我编写了一个小型云函数,该函数将云上的对象返回给某个类。然后我将它们与我在localStore中的内容进行了比较,并删除了那些不在Cloud中的内容。

在我的情况下,每次用户打开应用程序时都会更新,因为不需要实时更新。但是,如果您需要实时更新,则可以设置计时器,并使用要实时更新的类调用函数更新。

我将该实用程序上传到github:https://github.com/timpalade/ParseLocalDataStoreManager

可以在github上找到Intstructions和云代码。希望这可以帮助!