当我尝试保存没有网络连接的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。
而本地保存的对象具有所有正确的值。
答案 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:
。或者只是利用他们的缓存策略。
参考:
saveEventually
:API Class Reference 答案 1 :(得分:1)
这是sdk的一个错误。(1.6.2)
答案 2 :(得分:0)
我遇到了类似的问题,实际上我发现删除或不调用[Parse enableLocalDatastore];
会导致saveEventually
按预期执行(使用Parse 1.6.2)。我认为这需要[Parse enableLocalDatastore];
才能发挥作用。
答案 3 :(得分:0)
此错误现已在Parse版本1.6.3中修复!