1

由于 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 效果不佳,其中不存在空洞、稀疏数组。从 iOS 中的 Firebase 按顺序填充数组的正确方法是什么?我认为这可以通过将 .json 添加到 REST 调用的 URL 末尾来完成,但我想尝试坚持使用原生 Firebase iOS API。谢谢。

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

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

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

4

1 回答 1

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

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

于 2013-04-16T21:45:56.063 回答