iOS-Parse.com使用本地数据存储区同步多个设备

时间:2015-01-16 08:06:45

标签: ios parse-platform local-datastore

我正在尝试在iOS上使用local-datastore。

说我有两个或更多设备。

我使用saveEventually在本地(和云端)保存数据。只在一台设备上工作时,它可以正常工作。

当我开始使用多个设备时,要同步我使用:

PFQuery *query = [UserPreference query];
[query whereKey:@"userId" equalTo: [PFUser currentUser].objectId];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error){ 
if(!error){
    [UserPreference pinAllInBackground:objects block:^(BOOL succeeded, NSError *error) {<---- objects here are fine
    if(succeeded){
     [query fromLocalDatastore];
     NSLog(@"Local %@", [(UserPreference*)[[query findObjects] objectAtIndex:0] filterContext ]); <--- however here the old value is retrieved
     }
   }];
  }
}];

所以我从云中获得了正确的对象,然后我PinAll但是当我从localDataStore中检索时,会检索旧的值吗?

任何人都可以善意解释: 1.如果这是可行的,即使用本地数据存储在两个设备之间进行同步 2.我做错了什么?

PS:我注意到对象中的serverData包含正确的信息但不更新对象

2 个答案:

答案 0 :(得分:3)

这似乎有效。因此,当您从服务器获得更新时,您需要取消所有具有名称的对象,然后使用相同的名称将它们固定。之后,您可以查询pinWithName:

  PFQuery *query = [UserPreference query];
[query whereKey:@"userId" equalTo: [PFUser currentUser].objectId];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if(!error){
        [UserPreference unpinAllObjectsInBackgroundWithName:@"userPreference" block:^(BOOL succeeded, NSError *error) {
                [UserPreference pinAllInBackground:objects withName:@"userPreference"];
        }];
    }

答案 1 :(得分:1)

我有相同的要求,我发现上述有用,但有一些其他数据和其他人可能认为有用的不同选项。

我也有两个设备。所有数据都在本地数据存储区中并推送到解析服务器,这很有效,我可以在服务器上看到数据。但是,当我使用相同的帐户详细信息登录第二个新设备时,我无法获取所有数据。

登录后:

[PFUser logInWithUsernameInBackground:user password:pass block:^(PFUser *user, NSError *error) {
if (user) { /* success, user object is in local datastore */ }
}];

如果成功,则可以使用与用户对象关联的任何数据。但是必须要求与该用户相关的任何其他对象。因此,通过用户对象访问的字段存在,但是与用户对象相关的记录不存在。我发现以下内容可以获取其他数据:

PFQuery *query = [PFQuery queryWithClassName:@"History"];
[query whereKey:@"user" equalTo:[PFUser currentUser]];

[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if(!error){
        NSLog(@"Fetched %lu objects", (unsigned long)[objects count]);
        for (PFObject* item in objects)
            [item pinInBackground];
    } else {
        NSLog(@"Parse error pulling data after login: %@ %@", error, [error userInfo]);
    }
}];

最后,如果您希望服务器上的数据发生变化,您必须进行轮询。我已经通过网络上的解析登录更新了服务器上的数据,至少我没有看到这些更改传播到设备。我必须用查询将它们拉下来然后固定它们。