ios - Firebase 的有序数组

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

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

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

最佳答案

在这个特定的例子中,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);
}];

然后,每次有任何 child 发生变化时都会触发。但是,如果您想以增量方式构建表,则此选项可能不太适合。

另一种选择可能是改变数据结构以利用内置排序。因此,如果将来会有更多数据传输到此处,您可以将其转换为 JSON 等效项如下所示:
{
  "alfrescocafe": { "name": "@alfrescocafe", "type": "Truck" },
  "barshagyro": { "name": "@BarshaGyro", "type": "Truck" },
  "bigronsbistro": { "name": "@BigRonsBistro", "type": "Cart"}
}

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

关于ios - Firebase 的有序数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16029143/

相关文章:

iphone - 独特的隐形角色? objective-c

ios - 缩放图像然后滚动图像以查看下一张图像,上一张图像不会缩小

iphone - 无法将对象添加到 NSMutableArray

ios - 数组包含对象问题

firebase - 部署functions.pubsub.schedule时如何修复创建函数失败

c# - 未调用 Xamarin ObjC 绑定(bind)回调

ios - Plupload with iOS 仅适用于新照片,不适用于相机胶卷

iphone - NSMutableArray 直接分配时的内存管理

ios - 使用未声明的标识符 'FIRApp'

node.js - 如何从firestore数据库中的云功能更新多个文档?