2016-10-10 5 views
0

私はpalettesのすべての子を実行するコードを持っており、色の16進数がそれらの子の値のいずれかと一致するかどうかを調べます。一致するものがある場合は、childByAutoIDのURLを抽出して配列に追加します。返される値が配列に1回だけ追加されることをクエリして確認するにはどうすればよいですか?

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. 

       } 
      } 
     }) 
    } 

しかし、これに伴う問題は、2つの同様の値が同じchildByAutoIDの内側に存在する場合には、それは二回「URL」を追加することです。

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

arrayVarが印刷されたときに#000000textに等しく、とき[test1, test1, test2]を返します。

は、ここに私のJSONツリーの例です。

URLをchildByAutoIDに1回だけ追加するにはどうすればよいですか?たとえば、[test1, test2]です。

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) 
      } 
     } 
    }) 

あなたのURLを取得するにはちょうどです: - - は:

for eachUrl in arrayVar{ 

     let url = eachUrl.key 

    } 

をナビゲート

答えて

0

可変辞書にあなたの配列を変換し、その後、あなたは、キーとその値をboolean型として取得し、あなたのオブジェクトを設定しますディクショナリは配列よりもはるかに効率的でリレーショナルです。

+0

なぜ私は配列形式にする必要があるのか​​は、コレクションビューを作成するために使用する必要があるからです。したがって、これらのURLは画像に変換され、コレクションビューに表示される前に画像の配列を形成します –

+0

回答更新...辞書を簡単にナビゲートすることができます。配列全体を繰り返し、必要な値をチェックしているので、既に存在する場合はメモリが無駄です – Dravidian

+0

ありがとうございますが、私はjsonツリーを再構築して別のメソッドに移りました。私の現在のモデルはあまりにも面倒だったと思います。 –

関連する問題