iOS-Parse.com 将多个设备与本地数据存储同步
Posted
技术标签:
【中文标题】iOS-Parse.com 将多个设备与本地数据存储同步【英文标题】:iOS-Parse.com Syncing multiple devices with local datastore 【发布时间】:2015-03-14 19:10:56 【问题描述】:我正在尝试将本地数据存储与 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 包含正确的信息,但没有更新对象
【问题讨论】:
我对 Parse 不是很熟悉,但我认为您应该在最后一个查询中使用[[query fromLocalDatastore] findObjects]
或 [[query fromPin] findObjects]
之类的东西
嗨@danypata。感谢您的回答。我认为问题在于 pinAll 或 pin 无法正常工作,或者我没有正确使用它。就我而言,它根本不更新对象。这让我感到困惑,因为文档说:“启用本地数据存储后,您可以通过固定它来存储对象”和“每当您保存对对象的更改或从 Parse 获取新更改时,数据存储中的副本将自动更新,因此您不必担心。”
【参考方案1】:
这似乎可行。因此,当您从服务器获取更新时,您需要取消固定所有具有名称的对象,然后用相同的名称将它们固定回去。之后就可以查询 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"];
];
【讨论】:
【参考方案2】:我有同样的要求,我发现上述内容很有帮助,但有一些其他数据和其他人可能会觉得有用的不同选项。
我也有两个设备。所有数据都在本地数据存储中并推送到解析服务器,这很好用,我可以看到服务器上的数据。但是,当我使用相同的帐户详细信息登录第二台新设备时,我并没有获得所有数据。
登录后:
[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]);
];
最后,如果您希望服务器上的数据发生变化,您必须轮询它。我已经通过网络上的解析登录更新了服务器上的数据,至少我没有看到这些更改传播到设备。我必须通过查询将它们拉下来,然后固定它们。
【讨论】:
以上是关于iOS-Parse.com 将多个设备与本地数据存储同步的主要内容,如果未能解决你的问题,请参考以下文章