2017-07-18 25 views
2
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)的數組,然後將它們放入它們自己的數組中。Swift3 iOS -Firebase如何將節點數據分成不同的數組和字典

我將如何實現這樣的事情

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中,一旦它分離出來,我遇到的問題就是把所有東西都分離到不同的數組中。

回答

1

我打算拋開這個答案,因爲它解決了這個問題,並可能提供一些方向和其他選項。

在此代碼中,我們正在填充一個ClothingClass,其中包含與Firebase中的數據相匹配的數據。我們還有兩個數組bottomsarray和topsArray,它們將這些項保存在單獨的數組中(每個問題)。

這裏的概念是,Firebase中的所有內容都是快照,並且快照可以包含其他快照(即字典可以包含其他字典)。

我們通過.value讀取整個節點,每個高層節點(名稱牌)是這些節點(key: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] 
] 
+0

感謝幫助!自昨天晚上以來,我一直困擾着這個問題。集中並弄清楚這一點很困難。我不知道我可以拍攝快照:)。我將通過此代碼工作,將其應用於我正在使用的代碼並回復給您。再次感謝!!! –

+0

真棒問題,所以我upvoted它!如果答案有幫助,請務必接受它,以便它可以幫助其他人。 – Jay

+0

這是一個了不起的答案。我會100%投票。給我幾個小時,我找到了你 –

相關問題