2012-04-23 72 views
2

我在PFUser「firstName」和「lastName」上有兩個額外的列。他們正在妥善保存;我可以在數據瀏覽器中看到數據。PFUser在fetchAllIfNeeded調用objectForKey時拋出NSInternalInconsistencyException

我有另一個PFObject「類」,具有PFUsers的NSArray屬性。我使用PFObject上的類方法+ fetchAllIfNeededInBackground:block:來獲取PFUser的數組。在回調塊中,我在數組中的每個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.' 

編輯:訪問傳遞到塊回調fetchedObjects陣列+ fetchAllIfNeededInBackground不會拋出,但訪問最初傳遞給+ fetchAllIfNeededInBackground的實際數組會拋出。

在調用解決問題之前調用fetchIfNeeded,但是爲什麼?數據已經存在。我錯過了解+ fetchAllIfNeededInBackground,因爲它沒有更新擁有收集PFUsers的PFObject?

+1

很難說,因爲解析SDK不包括源和文檔不說關於使用fetchall什麼不是遞歸或傳遞。直接詢問Parse支持可能是一個很好的問題:新創業公司通常可以幫助你很快。 – ckhan 2012-04-23 05:33:52

+0

@ckhan好主意。會做。 – squinlan 2012-04-23 05:36:11

回答

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上調用刷新會將取回的數組返回到指針數組。就像這樣:

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]這樣做的文檔中....

1

你所描述的應該可以正常工作。 fetchAllIfNeeded自己更新數組中的對象,所以它不應該如何訪問它們。你說你通過父母PFObject訪問它們,但是你的調試器輸出直接顯示了通過數組的訪問。數組是否可能指向當前的PFObject成員?

一兩件事,而調試呼籲的PFUser實例isDataAvailable,後兩者的fetchAllIfNeeded你可以嘗試,和對你訪問他們的姓氏和名字之前。撥打fetchAllIfNeeded後,isDataAvailable應該爲陣列的每個元素返回YES。如果您在訪問名稱時仍然返回YES,則不應發出此錯誤。否則,如果您可以提供可重現問題的最小代碼示例,我很樂意進一步調試它。

謝謝,

+0

好點。我會將self.plan.invited的實現添加到我的問題中,以顯示訪問調試輸出的方式是否具有誤導性。至於isDataAvailable,我在數組中的每個PFUser上調用它,並在fetchAllIfNeeded返回了獲取數組後返回NO。 – squinlan 2012-04-23 20:12:55

相關問題