5

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

我正在执行以下过程,首先我创建PFObject具有不同值的 a 并调用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];

现在,我正在关闭应用程序并重新启动它,我正在加载我的联系人。我正在取回正确的对象,其中包含所有正确的名字、姓氏等值。

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。

在此处输入图像描述

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

4

4 回答 4

1

那么你到底想做什么?它是这样读的:

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

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

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

解决您的属性值问题 (self.contact | self.amount | self.incomingDebt) 你是如何定义这些的


我们已经从原来的帖子走了很长一段路,所以为了努力把它带回来,这里真正唯一的问题是saveEventually

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

的主要意图saveEventually

当您可能没有稳定的网络连接并且不需要知道保存何时完成时使用此选项

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

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

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


参考文献

于 2015-01-16T11:54:39.067 回答
1

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

在这里提交:https ://developers.facebook.com/bugs/1554492594835537/

于 2015-02-05T13:04:41.620 回答
0

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

于 2015-02-04T16:50:03.893 回答
0

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

于 2015-03-02T11:16:27.503 回答