2013-04-16 411 views
1

由於火力地堡有序排列從閱讀基地時,不保證順序,我們可以從這個異步調用獲得無序輸出:與火力地堡

-(void)loadDataFromFirebase 
{ 
    handles = [[NSMutableArray alloc] init]; 
    Firebase* listRef = [[Firebase alloc] initWithUrl:@"https://mobilefeast.firebaseIO.com/foodtrucks"]; 
    [listRef observeEventType:FEventTypeChildAdded withBlock:^(FDataSnapshot *snapshot) { 
     NSLog(@"%@", snapshot.name); 
     [handles addObject:snapshot.value]; 
     [self.handleTableView reloadData]; 
    }]; 
} 

在這個例子中下令從火力地堡閱讀片段中,我們可以訂購打印異步數據,但對於iOS中的NSArrays不適用,其中不存在hole-y稀疏數組。按照iOS中Firebase的順序填充數組的正確方法是什麼?我認爲這可以通過一個.json加載到REST調用的URL的末尾來完成,但想要嘗試使用本機Firebase iOS API。謝謝。

* 編輯:*尋找一個簡單的字母排序。看起來這應該在休息發生,並與REST以下URL的作用:

https://mobilefeast.firebaseio.com/foodtrucks/.json 

但我似乎無法複製與iOS的火力地堡API相同的排序。

回答

3

在這個特定的實例中,Firebase的異步特性並不是導致事件被看起來無序觸發的原因。在幕後,我們將所有數據保存爲字典 - 甚至是數組(請參見此處的基本原理:https://www.firebase.com/docs/managing-lists.html)。由於示例代碼使用的是事件類型,所以基於鍵(在這種情況下爲0,1,2,3,...,12,13,14 ...)按照字典順序觸發回調,然後導致你看到的輸出。請點擊此處查看:https://www.firebase.com/docs/ordered-data.html瞭解有關訂購在Firebase活動中發揮作用的各種方式的詳細信息。

根據您的示例代碼,你怎麼想到這個數據變化和成長,你有幾種選擇:

你可以只抓住了整個事情用一次全部FEventTypeValue在這種情況下,我們會與你擦肩而過按正確順序預編排NSArray。這看起來像

[listRef observeEventType:FEventTypeValue withBlock:^(FDataSnapshot *snapshot) { 
    NSLog(@"value: %@", snapshot.value); 
}]; 

然後,這將觸發每次任何兒童改變。但是,如果您想要逐漸構建表,則此選項可能不太合適。

另一種選擇是轉移數據結構以利用內置的順序。所以,如果有將是沿着這裏去在未來更多的數據,你可能會改變它,因此JSON相當於樣子:

{ 
    "alfrescocafe": { "name": "@alfrescocafe", "type": "Truck" }, 
    "barshagyro": { "name": "@BarshaGyro", "type": "Truck" }, 
    "bigronsbistro": { "name": "@BigRonsBistro", "type": "Cart"} 
} 

最後,最後的選擇將讓你保持陣列結構和火事件順序。您需要爲每個孩子添加優先級;在這種情況下,優先級將是數組元素的名稱。

+0

非常感謝,我誤解了JSON是如何排序的,並認爲我只需要一個未鍵控字符串列表並期望它自行排序。我認爲最好的方法是修改JSON的結構並讓Firebase的實時性完成其工作。 –

+0

不用擔心 - 很樂意幫忙! – Vikrum