Parse saveEventually保存空对象

时间:2015-01-15 22:34:50

标签: ios parse-platform local-datastore

当我尝试保存没有网络连接的PFObject时,它已成功保存在本地,每当我再次使用网络连接启动应用程序时,似乎该对象将保存到服务器,但所有参数都是空的。

我正在执行以下步骤,首先创建一个具有不同值的PFObject并调用saveEventually。在这些步骤中,我没有互联网连接(启用飞行模式),因此无法将其保存到服务器并在本地保存。

PFObject *contact = [PFObject objectWithClassName:@"Contact"];
[contact setObject:[PFUser currentUser] forKey:kRelatedToUserKey];
[contact setObject:self.firstname forKey:kFirstnameKey];
[contact setObject:self.lastname forKey:kLastnameKey];

[contact saveEventually];

现在,我关闭了应用并再次启动它,我正在加载我的联系人。我收回了正确的对象,其中包含firstname,lastname等所有正确的值。

PFQuery *postQuery = [PFQuery queryWithClassName:@"Contact"];
[postQuery whereKey:@"related_to_user" equalTo:[PFUser currentUser]];
[postQuery fromLocalDatastore];
[postQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        // here I get back the correct object from local storage, with all values
    }
}];

现在,当我关闭飞机模式时,它会尝试将对象保存到服务器,但我在后端看到的只是一个没有任何值的objectId。

enter image description here

而本地保存的对象具有所有正确的值。

4 个答案:

答案 0 :(得分:1)

那你准备做什么呢?以下是它的读物:

您的查询'联系人'类,一旦你查询它并通过它的ID找到一个对象(你不能用[PFObject *contact]做任何事情),那么你创建一个完全不同的PFObject类??如果您只是想发布一个PFObject,您可以绕过所有这些,但也许您省略了与该问题无关的其他代码?但是没问题。要回答您的问题saveEventually与本地数据存储一起工作,所以您不应该遇到任何问题,正如您所看到的那样,它会被调用,但您的价值观并非如此。 ;像objectID一样被保存。 objectID是自动创建的,这就是为什么它被保存而没有别的。我确实试图以各种可能的方式复制你的错误,但不能,它是你的价值观,他们正在返回零。我甚至使用了宏(它看起来就像你设置你的键一样),模拟飞机模式等。要验证,查询你的固定对象,看看它返回什么。此外,当您进行回调尝试包含明确定义它的if语句或switch语句以便更好地练习时,它是最好的:

{
    if (succeeded) {
         debt.parseID = newDebt.objectId;
    }];
}];

此外,要小心将基本任务放在成功块中,因为saveEventually的一个重要元素是,如果在应用程序终止之前它没有完成,并且如果对象仍在内存中,它将再次尝试,但如果对象不再在内存中,它将再次尝试下一个运行时,但 WITHOUT 成功块。

排查属性值(self.contact | self.amount | self.incomingDebt)如何定义这些


我们已经从原始帖子中走了很长一段路,所以为了尝试将其恢复,真正的且仅问题是saveEventually

  

将来在某个未指定的时间将此对象保存到服务器,即使Parse当前不可访问。

saveEventually的主要目的:

  

当您可能没有稳固的网络连接时使用此功能,并且 无需知道保存何时完成

     

如果等待发送超过10MB的数据,后续调用将导致旧的保存被静默丢弃,直到可以重新建立连接,并且可以保存排队的对象。

你无法控制何时调用它。此外,保存最终会将数据缓存在本地磁盘上,直到可以成功上载为止,因此固定同一对象是多余的。最后保存,如果您考虑它,是它自己的本地数据存储区,它会将它们存储在本地磁盘上,直到互联网可用(本地数据存储区)

你有两种方法可以避免这种情况。本地数据存储是一种核心数据特征,使用户可以通过简单的单行代码pin/pinInBackground:放弃NSFRC。您可以简单地固定对象,当您知道有互联网再次取消固定并保存到您的后端。或者,您可以通过其他方式执行此操作,立即调用可达性,如果没有互联网pin:,则首先调用saveInBackground:。或者只是利用他们的缓存策略。


参考

答案 1 :(得分:1)

这是sdk的一个错误。(1.6.2)

此处提交:https://developers.facebook.com/bugs/1554492594835537/

答案 2 :(得分:0)

我遇到了类似的问题,实际上我发现删除或不调用[Parse enableLocalDatastore];会导致saveEventually按预期执行(使用Parse 1.6.2)。我认为这需要[Parse enableLocalDatastore];才能发挥作用。

答案 3 :(得分:0)

此错误现已在Parse版本1.6.3中修复!