带Firebase的有序数组

时间:2013-04-16 05:03:06

标签: ios nsmutablearray firebase

由于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复制相同的顺序。

1 个答案:

答案 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"}
}

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