2016-10-10 21 views
0

我有一個代碼,它運行通過palettes的所有孩子,並找出顏色十六進制是否與這些孩子中的任何值相匹配。如果匹配,它會從childByAutoID中提取URL,然後將其添加到數組中。如何查詢並確保返回的值只添加到數組中?

databaseRef.child("palettes").queryOrdered(byChild: "top").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { (snapshot) in 

      if let snapDict = snapshot.value as? [String:AnyObject]{ 

       for each in snapDict as [String:AnyObject]{ 

        let _URL = each.value["URL"] as! String 
        self.arrayVar.append(_URL) // Turning it into an array. 

       } 
      } 
    }) 

     databaseRef.child("palettes").queryOrdered(byChild: "bottom").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { (snapshot) in 

      if let snapDict = snapshot.value as? [String:AnyObject]{ 

       for each in snapDict as [String:AnyObject]{ 

        let _URL = each.value["URL"] as! String 
        self.arrayVar.append(_URL) // Turning it into an array. 

       } 
      } 

     }) 

     databaseRef.child("palettes").queryOrdered(byChild: "accessories").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { (snapshot) in 

      if let snapDict = snapshot.value as? [String:AnyObject]{ 

       for each in snapDict as [String:AnyObject]{ 

        let _URL = each.value["URL"] as! String 
        self.arrayVar.append(_URL) // Turning it into an array. 

       } 
      } 

     }) 

     databaseRef.child("palettes").queryOrdered(byChild: "shoes").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { (snapshot) in 

      if let snapDict = snapshot.value as? [String:AnyObject]{ 

       for each in snapDict as [String:AnyObject]{ 

        let _URL = each.value["URL"] as! String 
        self.arrayVar.append(_URL) // Turning it into an array. 

       } 
      } 
     }) 
    } 

然而,這樣做的問題是,當有相同childByAutoID內的兩個相似的價值觀,它會追加「網址」兩次。

這裏是我的JSON樹的例子:

{ 
    "palettes" : { 
    "-KTjfdgcwdkF5j3OWOg8" : { 
     "URL" : "test1", 
     "accessories" : "#000000", 
     "bottom" : "#2B676E", 
     "shoes" : "#000000", 
     "top" : "#274E64" 
    }, 
    "-KTji_7xUNu2PejD4Xz6" : { 
     "URL" : "test2", 
     "accessories" : "#2B6766", 
     "bottom" : "#2B676E", 
     "shoes" : "#000000", 
     "top" : "#274E64" 
    } 
    } 
} 

將返回[test1, test1, test2]#000000等於text,當打印arrayVar

如何確保URL只附加一次childByAutoID?例如,[test1, test2]在這種情況下。

回答

0

您的數組轉換爲一個可變的字典,然後設置檢索爲重點,其價值布爾你的對象: -

var arrayVar = NSMutableDictionary() 
databaseRef.child("palettes").queryOrdered(byChild: "shoes").queryEqual(toValue: text).observeSingleEvent(of: .value, with: { (snapshot) in 

     if let snapDict = snapshot.value as? [String:AnyObject]{ 

      for each in snapDict as [String:AnyObject]{ 

       let _URL = each.value["URL"] as! String 
       self.arrayVar.setObject(true, forKey: _URL as NSCopying) 
      } 
     } 
    }) 

爲了讓您的網址只是: -

for eachUrl in arrayVar{ 

     let url = eachUrl.key 

    } 

導航通過字典比數組更有效率和關係,特別是在firebase中。

+0

哦,我需要它在數組形式的原因是因爲我需要使用它來填充collectionsview。因此,這些URL將被翻譯成圖像以形成一個圖像數組,然後顯示在一個collectionsView –

+0

答案更新...您可以輕鬆地瀏覽字典來這樣做。當遍歷整個數組並檢查所需的值時,如果它已經存在,則會浪費內存 – Dravidian

+0

謝謝,但是我通過重構我的json樹來採取另一種方法。我認爲我現在的模型太麻煩了。 –

相關問題