由于Firebase在从基地读取时不保证顺序,我们可以通过此异步调用获得无序输出:
-(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的示例有序阅读片段中,我们可以命令打印异步数据,但这对于iOS中的NSArrays来说效果不好,因为不存在hole-y,稀疏数组。从iOS中的Firebase按顺序填充数组的正确方法是什么?我认为这可以通过将.json添加到REST调用的URL的末尾来实现,但是想要尝试坚持使用本机Firebase iOS API。感谢。
* 编辑:* 寻找简单的字母排序。看起来这应该在Rest中发生,并在REST中使用以下URL:
https://mobilefeast.firebaseio.com/foodtrucks/.json
但我似乎无法使用iOS Firebase API复制相同的顺序。
答案 0 :(得分:3)
在这个特定的实例中,Firebase的异步特性并不是导致事件似乎无序触发的原因。在幕后我们将所有数据保存为字典 - 甚至数组(参见此处的基本原理:https://www.firebase.com/docs/managing-lists.html)。由于示例代码使用FEventTypeChildAdded
事件类型,因此基于键(在本例中为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"}
}
最后,最后一个选项将允许您保持数组结构并按顺序触发事件。您需要为每个孩子添加优先级;在这种情况下,优先级将是数组元素的名称。