2013-04-16 372 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