有序arrays与Firebase

由于Firebase不能保证在从基础读取时的顺序,我们可以从这个asynchronous调用获得无序的输出:

-(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]; }]; } 

在从Firebase中读取片段的例子中,我们可以命令打印asynchronous数据,但是对于iOS中的NSArrays来说,这并不适用,其中不存在hole-y稀疏数组。 从iOS的Firebase中按顺序填充数组的正确方法是什么? 我认为这可以通过添加一个.json文件来完成,这个.json文件添加到一个REST调用的URL的末尾,但是想试图使用原生的Firebase iOS API。 谢谢。

* 编辑:*寻找一个简单的字母sorting。 看起来这应该发生在Rest中,并在REST中使用以下URL:

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

但我似乎无法复制与iOS Firebase API相同的顺序。

在这个特定的例子中,Firebase的asynchronous特性并不是什么导致事件被触发,看似没有秩序。 在幕后,我们将所有数据保存为字典,甚至是数组(请参阅此处的基本原理: https : //www.firebase.com/docs/managing-lists.html )。 由于示例代码使用的是FEventTypeChildAdded事件types,因此callback会按照键(在这种情况下为0,1,2,3,…,12,13,14 …)按字典顺序触发,然后导致你看到的输出。 看看这里: https : //www.firebase.com/docs/ordered-data.html有关sorting在Firebase事件中发挥作用的各种方式的更多详细信息。

根据您的示例代码以及您希望如何更改和增长这些数据,您有几个select:

您可以使用FEventTypeValue一次性捕获整个事件,在这种情况下,我们将按照正确的顺序向您传递一个预先构build的NSArray 。 这看起来像

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

每当有任何一个孩子改变时,这就会触发。 但是,如果您想要逐渐构build表,则此选项可能不太适合。

另一个select可能是转移数据的结构以利用内置的顺序。 所以,如果未来会有更多的数据出现在这里,那么可以将其转换为JSON等价物:

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

最后,最后一个选项将允许您保持数组结构并按顺序触发事件。 您需要为每个孩子添加优先级; 在这种情况下,优先级将是数组元素的名称。