由于当前FirebaseUI的FUICollectionDataSource处理了UI的所有更改,因此我正在使用FUIArray并观察对数据源的更改以及手动更新我的collectionView。但是,乍一看,我相信我应该已经实现FUIIndexArray,因为它的排序行为。但是,我不确定这是两个init查询。

从文档:


  • @param index一个Firebase数据库查询,其子关键字均为数据查询的所有子关键字。
  • @param data一个Firebase数据库引用,将根据其引用获取其子级并将其用于填充数组的内容。
    索引查询。


  • 对于数据参数,我使用的是与FUIArray(有效)相同的查询。对于索引参数,我不确定要使用什么参数,因此我使用相同的查询进行测试,但似乎无法正常工作。在两个查询中,我都按优先级排序。如果我检查FUIIndexArray的长度,则会得到正确的计数,但是当我检查其.items时,数组为空。
    FUIIndexArray是否应该与FUIArray类似地工作,除了它还会返回索引之外?索引查询应该是什么样的?

    最佳答案

    好像对FUIIndexArray实际应该执行的操作有些困惑。 FUIIndexArray使用索引查询子级的键从数据查询中加载子级,这意味着每个元素加载都将变为异步,并且如果这些加载均未完成,则.items将不返回任何内容(尽管可能应返回一个包含以下内容的数组)此处是NSNull)。
    FUIIIndexArray旨在通过查询来确切指定应加载哪些元素,从而使加载大型数据集的非常精细的部分变得更加容易。假设您的数据库如下所示:

    // An index to track Ada's memberships
    {
      "users": {
        "alovelace": {
          "name": "Ada Lovelace",
          // Index Ada's groups in her profile
          "groups": {
             // the value here doesn't matter, just that the key exists
             "techpioneers": true,
             "womentechmakers": true
          }
        },
        ...
      },
      "groups": {
        "techpioneers": {
          "name": "Historical Tech Pioneers",
          "members": {
            "alovelace": true,
            "ghopper": true,
            "eclarke": true
          }
        },
        ...
      }
    }
    

    如果usersgroups都是非常大的数据集,那么您将希望能够仅选择性地下载特定用户所属的组。 FUIIndexArray完全解决了该用例(仅此而已)。
    let adasGroups = database.reference(withPath: "users/alovelace/groups")
    let allGroups  = database.reference(withPath: "groups")
    
    // array will load only alovelace's groups
    let array = FUIIndexArray(index: adasGroups, data: allGroups, delegate:self)
    

    由于必须分别加载每个元素,因此FUIIndexArrayDelegate提供了一个回调来单独处理每个加载,并且实现此回调以正确处理成功的加载和错误会增加代码库的分形复杂性。您应该尽可能避免使用FUIIndexArray,而是坚持使用简单得多的FUIArray,尤其是如果没有索引就可以满足查询限制的需求时。

    08-03 19:21