【问题标题】:Swift : Simplifying Nested Firebase Fetching/QueriesSwift:简化嵌套的 Firebase 获取/查询
【发布时间】:2018-04-01 22:59:32
【问题描述】:

我很想知道是否有办法简化我的 Firebase DB 查询。

另外,提出拉取请求时要遵循哪些最佳实践。

我注意到添加子级导致的层次结构越复杂,我的代码中的查询就会变得非常费力和冗长。

以下是我的应用程序中的查询示例:

【问题讨论】:

    标签: ios iphone swift firebase firebase-realtime-database


    【解决方案1】:

    如果您发现自己需要复杂的查询,这很可能意味着您的数据结构不正确。 在您的情况下,您的结构需要标准化(展平)。

    以下修改应该使您的查询更简单:

    {
      "listings": {
         "listing_key_1": {
            "timestamp": "2017 10 19 07:49:38"
         },
         "listing_key_2": {
            "timestamp": "2017 10 19 05:30:02"
         },
         ...
      },
    
      "AircraftHouseRules": {
         "listing_key_1": {
             "Availability": "",
             ...
         },
         "listing_key_2": {
             "Availability": "",
             ...
         }
      },
    
      "BasicInfo": {
         "listing_key_1": {
             "ModelPlane": "",
             ...
         },
         "listing_key_2": {
             "ModelPlane": "",
             ...
         }
      },
      ...
    }
    

    我不明白您所说的“拉取请求”是什么意思。如果您的意思是观察或只是读取数据,那非常简单。在您的情况下,您只需要一个listing id/key 即可直接访问其数据(AircraftHouseRulesBasicInfoDetailedInformation 等...)。

    如果您想要反向(通过例如 TypeOfPlane 获取列表的键),您可以执行以下查询

    // NOTE: Untested code - just for illustrative purposes
    let queryRef = Database().database.reference.child("BasicInfo").queryOrdered(byChild: "TypeOfPlane").queryEqual(to: "some type")
    
    queryRef.observeSingleEvent(of: .value, with { snapshot in
        if let listings = snapshot.value as? [String : Any] { 
          // all retrieved listings with TypeOfPlane == "some type"
        } 
    })
    

    提示

    您应该始终avoid nesting structures 以避免下载不必要的数据并影响性能。在您发布的屏幕截图中,您最多有 8 级嵌套数据。通过上面的修改,您可以轻松地将这些级别减半。

    您还应该考虑将所有数组结构(如ImageRef 下的那些)替换为arrays can be evil 的键值对。

    【讨论】:

    • 感谢您的建议。我会做出改变。
    猜你喜欢
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多