2017-07-16 9 views

答えて

9

スナップショットには2つのプロパティがあります。

snapshot.key 
snapshot.value 

.valueのオブザーバを使用する場合。すべてのkey:valueの子がスナップショットに返されます。それらは各キー:値のペアをこのようにキャプチャするために繰り返すことができます。

ref.observeSingleEvent(of: .value, with: { (snapshot) in 
    for child in snapshot.children { 
     let snap = child as! DataSnapshot 
     let key = snap.key 
     let value = snap.value 
     print("key = \(key) value = \(value!)") 
    } 
}) 

valueプロパティには、文字列、数値、配列、または別の辞書(スナップショット)を使用できます。元の質問では、それは文字列です。

3

このような何かが(より良いという名前の変数で)動作するはずです:辞書

  • 辞書の.keysを使用して

    1. snapshot.valueキャスト& .valuesのプロパティを取得して、LazyMapCollectionタイプとして取得します。
    2. コレクションを使用して配列を初期化します。

    コード:

    self.ref? 
        .child("data") 
        .child("success") 
        .child(userID!) 
        .observeSingleEvent(of: .value, with: { (snapshot) in 
         if let data = snapshot.value as? [String: Any] { 
          let keys = Array(data.keys) 
          let values = Array(data.values) 
          ... // Your code here 
         } 
        } 
    

    更新は - 順序が尊重された場合の例を表示するには:

    私はおそらくそれがArray<(key: String, value: Any)>を入力するキャストのアレイに辞書を保存します。次に、それをキーまたは値にマップして、順序を保持することができます。

    ... // As above 
        .observeSingleEvent(of: .value, with: { (snapshot) in 
         if let data = snapshot.value as? [String: Any] { 
          let dataArray = Array(data) 
          let keys = dataArray.map { $0.0 } 
          let values = dataArray.map { $0.1 } 
          ... // Your code here 
         } 
        } 
    
  • +0

    ここでの問題は、注文が失われることです。 – Jay

    +0

    @Jayコメントを反映するようにコードを更新しました。これで問題は解決しますか? – Yasir

    +0

    値が別のスナップショットの場合、残念ながらそれは機能しません。しかし、OPがこの値を文字列または数字(すなわち、直接注文可能な値)に保つ限り、この質問には*働きます。私は解決策が好きです! – Jay

    1

    私は私のプロジェクトで同様のことをしたいと思っていました。これが助けてほしいと思ったら、あなたはそのアイデアを手に入れてください。

    var photosList = [String]() 
    refToObserve?.observeSingleEvent(of: .value, with: {snapshot in 
         if let snapshotValue = snapshot.value as? [String:Any] { 
          for child in snapshot.childSnapshot(forPath: ***your path***).children { 
           let myChild = child as! DataSnapshot 
           if let myChildValue = myChild.value as? [String:Any] { 
            self.photosList.append(myChildValue["postId"] as! String) 
           } 
          } 
         } 
        }) 
    
    関連する問題