2

我的 PFUser “firstName”和“lastName”上有两个额外的列。他们正在妥善保存;我可以在数据浏览器中看到数据。

我有另一个 PFObject“类”,它有一个 NSArray 的 PFUsers 属性。我在 PFObject 上使用类方法+fetchAllIfNeededInBackground:block:来获取 PFUsers 数组。在回调块中,我在数组中的每个 PFUser 上调用 objectForKey:,但我通过拥有的 PFObject 访问它们。

// invited is the NSArray of PFUsers
self.whoCell.mainLabel.text = [[self.plan.invited objectAtIndex:0] 
                                                  objectForKey:@"firstName"];

调试器在 objectForKey 调用之前的断点处输出:

(lldb) po self.plan.invited
(NSArray *) $4 = 0x06e62a60 <__NSArrayM 0x6e62a60>(
<PFUser:GCCdPjCU2J> {
    firstName = Fake;
    lastName = Account;
    username = yyajnbafv53qw4yhjm9sfoiis;
}
)

编辑:添加 self.plan.invited 的实现,因为上述内容具有误导性。

- (NSArray*)invited
{
  // self.dataSource is a PFObject*
  return [self.dataSource objectForKey:INVITED_PROP];
}

然而,当上面调用它时,它对 objectForKey:抛出了这个异常:

'NSInternalInconsistencyException', reason: 'Key "firstName" has no data.  Call fetchIfNeeded before getting its value.'

编辑:访问传递给+fetchAllIfNeededInBackground的块回调的 fetchedObjects 数组不会抛出,但访问最初传递给+fetchAllIfNeededInBackground的实际数组会抛出。

在调用解决问题之前调用 fetchIfNeeded,但为什么呢?数据已经存在。我是否错过了+fetchAllIfNeededInBackground的理解,因为它没有更新拥有 PFUser 集合的 PFObject?

4

2 回答 2

6

我弄清楚发生了什么。让我用代码解释一下:

PFQuery *query = [PFQuery queryWithClassName:@"TestClass"];
PFObject *testObj = [query getObjectWithId:@"xWMyZ4YEGZ"];

// an array of PFUser "pointers" (pointers in Parse parlance)
NSLog(@"%@", [testObj objectForKey:@"userArrayProp"]);
[PFObject fetchAll:[testObj objectForKey:@"userArrayProp"]];

// now userArrayProp contains fully fetched PFObjects
NSLog(@"%@", [testObj objectForKey:@"userArrayProp"]);

对我来说,经过一段时间后,userArrayProp 会恢复为“指针”数组,这让我很困惑。我的问题是在 PFObject 上调用刷新会将获取的数组 BACK 还原为指针数组。像这样:

PFQuery *query = [PFQuery queryWithClassName:@"TestClass"];
PFObject *testObj = [query getObjectWithId:@"xWMyZ4YEGZ"];

// an array of PFUser "pointers" (pointers in Parse parlance)
NSLog(@"%@", [testObj objectForKey:@"userArrayProp"]);
[PFObject fetchAll:[testObj objectForKey:@"userArrayProp"]];

// now userArrayProp contains fully fetched PFObjects
NSLog(@"%@", [testObj objectForKey:@"userArrayProp"]);

[testObj refresh];

// now userArrayProp contains pointers again :(
NSLog(@"%@", [testObj objectForKey:@"userArrayProp"]);

希望它在文档中说这样[PFObject refresh]做了....

于 2012-04-24T08:09:08.443 回答
1

您所描述的应该可以正常工作。 fetchAllIfNeeded更新数组中的对象本身,因此您如何访问它们并不重要。您说您正在通过 parent 访问它们PFObject,但您的调试器输出显示直接通过数组访问。数组是否有可能没有指向当前PFObject成员?

调试时可以尝试的一件事是调用isDataAvailable的实例PFUser,无论是在 之后fetchAllIfNeeded,还是在访问它们的名字和姓氏之前。调用后fetchAllIfNeededisDataAvailable应该YES为数组的每个元素返回。如果在您访问名称时它仍然返回YES,他们不应该给出这个错误。

否则,如果您可以提供重现问题的最小代码示例,我很乐意进一步调试它。

谢谢,

于 2012-04-23T17:51:47.627 回答