2016-03-18 49 views
0

我對Firebase真的很陌生,但我開始喜歡它。所以我在將快照的值傳遞給塊之外時遇到問題。iOS Firebase如何在Block之外傳遞快照值/鑰匙

我想使用NSStrings和/或NSarrays成爲快照的價值。以便我可以在我的其他代碼中使用它們。

這裏是我的代碼

NSString *string1; 
NSArray *array1; 
Firebase *usersRef = [fb childByAppendingPath:@"Parent name"]; 

FQuery *statesRef = [usersRef queryOrderedByChild:@"email"]; 

FQuery *specificStateRef = [statesRef queryEqualToValue:@"user name"]; 

[specificStateRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 

    //NSLog(@"snapshot: %@", snapshot); 
    NSLog(@" key: %@", snapshot.key); 
    NSLog(@" value: %@", snapshot.value); 
    //HELP ME HERE 
    array1=[[NSarray alloc]initwithObjects:snapshot.value]; 
    string1=snapshot.key; 

}]; 

所以外面這一塊,如果我寫的。

NSLog(@" String1 = %@", string1); 
    NSLog(@" Array1 = %@", array1); 

不幸的是,string1和array1的值都等於零。如何從Firebase獲取值,然後在整個代碼中使用它們。我怎樣才能將這些值從塊中取出?感謝你們

回答

0

現在有你的問題:

陣列1 = [[NSArray的頁頭] initwithObjects:snapshot.value]。

您每次運行時都在塊中初始化陣列。

定影容易

塊(也許是定義爲一個屬性,全局變量或__block)

@property NSMutableArray *myMutableArray = [NSMutableArray new]; 

塊內

[myMutableArray addObject: snapshot.value]; 

有一件事你也可眺望外面是爲每個子對象調用一次.childAdded事件,然後再調用任何新的子對象。

因此,在這種情況下,如果父節點有三個與查詢匹配的子節點,則該塊將被調用三次,這就是爲什麼我們在塊內添加每個子節點的原因。

如果要同時讀取所有結果,可以使用.value,然後迭代結果。

沒有對錯,它取決於你的用例。 (.value可能會讀取數以千計的可能會成爲內存問題的結果。)

有關.childAdded和.value的詳細信息,請參閱Firebase Retrieving Data

哦 - 另一個說明。處理在塊內檢索的塊外部的數據可能會非常棘手,因爲該塊需要時間才能完成。舉例來說,例如,您的互聯網日期很糟糕,而且您的速度很慢 - 在該塊有時間完成之前,塊外的代碼可能會執行。所以只有當你知道塊已經完成時才處理數據。 (例如,使用塊內的數據,設置完成的標誌或其他機制,在某些情況下.value使這更容易)。

+0

嘿周杰倫謝謝。這很糟糕,我在這個街區之外工作,但是你推薦什麼旗幟?因爲在塊外讀取時整數或字符串的值等於null。所以如果在塊內我設置整數等於1,在整數值不等於1的塊之外。那麼你推薦什麼標記機制?如果你沒有答案,這很難,所以不用擔心,我很感激幫助。 – user3352739

+0

你的評論更多的是一個迅速/ objc的問題,並在我的答案回答;定義塊外的變量(如數組),然後在從Firebase返回數據時設置塊內的值。舉例來說,如果你想填充一個數組作爲tableView的dataSource。在塊外定義數組,通過.value查詢數據。然後迭代填充數組的快照(仍在塊中),然後在完成該迭代時刷新tableView。 – Jay

+0

我不想要一個tableview。我真的需要弄清楚這一點。 – user3352739