2017-12-10 2 views
0

私は画像の値を取得したいと思います。ノードはこのように見えるので、url1、url2、url3を取得したいと思います。速報でFirebaseがautoIdの値を取得

"Post": { 
    "uid": { 
     "Text": "some text", 
     "images": { 
     autoID1: url1, 
     autoID2: url2, 
     autoID3: url3 
     } 
    } 
    } 

問題はキーが自動生成されていることです。だから、私は通常このようにキャストします。

if let dictionary = snapshot.value as? [String:Anyobject] 
let text = dictionary["text"] as? String 

ですが、この場合、autoIDキーをキャストして値を取得する方法がわかりません。 私は以下のコードを試みたが、エラーが

は、型の値をキャストすることができませんでした '__NSDictionaryM'(0x10af491c8) 'NSStringの'(0x10a0bad68)へ。 3つのURLが存在する場合

func fetchImages() { 
    ref.child("Post").child(uid!).child("images").observe(.value, with: { (snapshot) in 

      let downloadUrl = snapshot.value as! String 
      let stoRef = Storage.storage().reference(forURL: downloadUrl) 

      stoRef.getData(maxSize: 1*1024*1024, completion: { (data, error) in 
       let pic = UIImage(data: data!) 
       self.imagesArray.append(pic!) 
      }) 

    }, withCancel: nil) 
} 

も、私はをループにfor snap in snapshot.childrenのように使うべきか?それらのURLをループしてimagesArrayに挿入する方法は? ありがとうございます!

答えて

1

あなたは非常に近いです。キーが「画像」であると値のペア:覚えておくべき事はあなたが

.child("images") 

を得るとき、それは実際に子供

"images": { 
    autoID1: url1, 
    autoID2: url2, 
    autoID3: url3 

を含むノードだと、文字列が、別のキーではないということです値は子ノードです。

、子供を取得したスナップショットでの子ノードを反復、スナップショットとしてそれぞれ1をキャストするには、次のキーがautoID1などであることを(別のキーと値のペア)と値はURL(String)を

ですrefはクラスvarがある場合、それはあなたの質問に表示される
let imagesRef = self.ref.child("Post").child("uid_0").child("images") 
imagesRef.observeSingleEvent(of: .value, with: { snapshot in 
    for child in snapshot.children { 
     let snap = child as! DataSnapshot 
     //let key = snap.key //autoID1, autoID2 etc 
     let downloadUrl = snap.value as! String 
     let stoRef = Storage.storage().reference(forURL: downloadUrl) 
     //get your pic 
    } 
}) 

、それを参照する必要があります。また

self.ref 

として、あなたが変更を通知することができますので、ノード上のオブザーバを残しておきたい場合は、 .observeを使用します。私の場合、私は一度それを読んでみたかったので、私はobserveSingleEventを一度だけ読んでみたかったので使用しました。

+0

本当にありがとうジェイそれは完全に働いた!あなたの詳細な説明にも感謝します:) – Daibaku

関連する問題