4

我正在尝试将本地数据存储与 iOS 一起使用。

假设我有两个或更多设备。

我使用 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 包含正确的信息但不更新对象

4

2 回答 2

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"];
        }];
    }
于 2015-01-16T15:39:20.213 回答
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]);
    }
}];

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

于 2015-03-24T08:17:35.303 回答