【问题标题】:Swift3 iOS -Firebase How to Separate Node Data Into Different Arrays and DictionariesSwift3 iOS -Firebase 如何将节点数据分离到不同的数组和字典中
【发布时间】:2017-12-23 16:07:50
【问题描述】:
root
  |
  @-clothing
      |
      @-nameBrandRalphLauren//topLevel
      |  |
      |  @-apparelTops//child
      |  |    |-"garmetSweater":"white"
      |  |    |-"garmetTshirt":"blue"
      |  |    |-"postedBy":"user123"
      |  |
      |  @-apparelBottoms//child
      |       |-"garmetShorts":"tan"
      |       |-"garmetJeans":"blue"
      |       |-"postedBy":"user123"
      |
      @-nameBrandNike//topLevel
         |
         @-apparelTops//child
              |-"garmetSweater":"gray"
              |-"garmetTshirt":"pink"
              |-"postedBy":"user789"

我在 Firebase 中有几个顶级节点,它们下面也有子节点。子节点内部是键和值。我想将每个 topLevelNode (RalphLauren,Nike) 分成一个数组,其中包含它的子节点 (apparelTops, apparelBottoms),然后将它们放入自己的数组中。

我将如何实现这样的目标

var nameBrandNodes = [String]()
var apparelNodes = [[String]]()
var garmetNodes = [[String:Any]]()

nameBrandNodes = [RaplhLaurn, Nike]
apparelNodes = [[apparelTops, apparelBottoms], [apparelTops, apparelBottoms]]
garmetNodes = [["postedBy":"user123"], ["garmetSweater":"white"],["garmetTshirt":"blue"],["garmetShorts":"tan"], ["garmetJeans":"blue"], ["postedBy":"user789"], ["garmetSweater":"gray"], ["garmetTshirt":"pink"]]

//**EDIT** Jay's answer is CORRECT. I forgot to add this and added it after he answered
var nameBrandArrayOfDict = [[String:[String]]]

nameBrandArrayOfDict = [[nameBrandRalphLauren:[apparelTops,apparelBottoms], [[nameBrandNike:[apparelTops,apparelBottoms]]

//this is only necessary because sometimes there won't be an apparelBottomsNode or apparelTopsNode for e.g.
nameBrandArrayOfDict = [[nameBrandRalphLauren:[apparelTops], [[nameBrandNike:[apparelBottoms]]

代码如下:

let rootRef = Database.database().reference()

var nameBrandNodes = [String]()
var apparelNodes = [[String]]()
var garmetNodes = [[String:Any]]()


let clothingRef = rootRef.child("clothing")

clothingRef?.observe(.childAdded, with: {
            (snapshot) in

       //nameBrandNodes now contains RalphLauren and Nike
       self.nameBrandNodes.append(snapshot.key)

       for nameBrand in self.nameBrandNodes{

                 let apparel = rootRef.child("clothing").child("nameBrand")
                 apparel.observeSingleEvent(of: .value, with: {
                         (snapshot) in

                         for child in snapshot.children {
                             //what should I do in here?
                         }
        }

我的最终结果是我使用了一个垂直的 tableView 和一个水平的 collectionsView。我将列出 tableView 中的 nameBrands、collectionView 中的服装以及 collectionViews 单元格中的服装项目。我知道如何在分离后将所有内容放入 tableView 和 collectionView 中,我遇到的问题是将所有内容分成不同的数组。

【问题讨论】:

    标签: arrays swift loops dictionary firebase


    【解决方案1】:

    我将放弃这个答案,因为它解决了这个问题,并可能提供一些方向和其他选择。

    在这段代码中,我们填充了一个 ClothingClass,其中包含与 Firebase 中的数据匹配的数据。我们还有两个数组 bottomsArray 和 topsArray 将这些项目保存在单独的数组中(根据问题)。

    这里的概念是 Firebase 中的一切都是快照,快照可以包含其他快照(即字典可以包含其他字典)。

    我们通过 .value 读取整个节点,每个高级节点(名牌)是这些节点的键(键:值对中的键)。另一方面,该值也是快照,即

    let apparelBottomsSnap = nameBrandSnap.childSnapshot(forPath: "apparelBottoms")
    

    一旦我们有了这些快照,将它们的值分配给字典,然后从那里添加 ClothingClass 以及单独的数组。 ClothingClass 和数组之间没有关联,除了使用类是本示例在代码中组织数据的另一种方式。

        class ClothingClass {
            var nameBrand = ""
            var bottomsDict = [String: Any]()
            var topsDict = [String: Any]()
        }
    
        var bottomsArray = [[String: Any]]()
        var topsArray = [[String: Any]]()
        var clothingArray = [ClothingClass]()
    
        let clothingRef = self.ref.child("clothing")
        clothingRef.observeSingleEvent(of: .value, with: { snapshot in
    
            for child in snapshot.children {
                let nameBrandSnap = child as! DataSnapshot //this is each name_brand
                let apparelBottomsSnap = nameBrandSnap.childSnapshot(forPath: "apparelBottoms")
                let apparelTopsSnap = nameBrandSnap.childSnapshot(forPath: "apparelTops")
    
                let bottomsDict = apparelBottomsSnap.value as! [String: Any]
                let topsDict = apparelTopsSnap.value as! [String: Any]
    
                let aClothing = ClothingClass()
                aClothing.nameBrand = nameBrandSnap.key
                aClothing.bottomsDict = bottomsDict
                aClothing.topsDict = topsDict
                clothingArray.append(aClothing)
    
                bottomsArray.append(bottomsDict)
                topsArray.append(topsDict)
            }
    
            //for testing
            for c in clothingArray {
                let n = c.nameBrand
                let b = c.bottomsDict
                let t = c.topsDict
    
                print("n: \(n)")
                print("  b: \(b)")
                print("  t: \(t)")
            }
    
            print(topsArray)
            print(bottomsArray)
        })
    

    结束的测试循环遍历整个服装类的数组并打印每个类的属性

    n: name_brand_0
      b: ["garmetJeans": Blue, "garmetShorts": Pink, "postedBy": user_2]
      t: ["garmetShirt": blue, "garmetSweater": blue, "postedBy": user_0]
    n: name_brand_1
      b: ["garmetJeans": Orange, "garmetShorts": Navy, "postedBy": user_3]
      t: ["garmetShirt": Green, "garmetSweater": Yellow, "postedBy": user_1]
    

    下面的打印语句打印顶部

    [
      ["garmetShirt": blue, "garmetSweater": blue, "postedBy": user_0],
      ["garmetShirt": Green, "garmetSweater": Yellow, "postedBy": user_1]
    ]
    

    和底部

    [
      ["garmetJeans": Blue, "garmetShorts": Pink, "postedBy": user_2],
      ["garmetJeans": Orange, "garmetShorts": Navy, "postedBy": user_3]
    ]
    

    【讨论】:

    • 感谢您的帮助!!!从昨天晚上开始,我就被这个问题难住了。集中注意力并弄清楚这一点是很困难的。我不知道我可以拍摄快照:)。我将研究这段代码,将它应用到我正在使用它的地方,然后回复你。再次感谢!!!
    • 很棒的问题,所以我投了赞成票!如果答案有帮助,请务必接受它,这样它也可以帮助其他人。
    • 这是一个很棒的答案。我会 100% 赞成。给我几个小时,我找到你了
    • 我知道我忘了添加一些东西。如果你有机会,我添加了一个编辑。无论哪种方式,我都接受您的答案是正确的。再次感谢
    • @LanceSamaria 我建议在我的回答中检查 ClothingClass。虽然您当然可以使用多个数组和字典,但类数组通常更易于维护,并且在以后需要时更易于扩展。也许您的编辑会证明一个不同的问题,该问题将围绕利用类结构来保存您的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 2021-06-25
    • 1970-01-01
    相关资源
    最近更新 更多