2017-12-07 6 views
1

Ich möchte mehrere Bilder mit etwas Text in Firebase hochladen, wenn der Benutzer die Taste drückte. Um dies zu tun, implementierte ich for-Schleife. Nehmen wir an, wenn der Benutzer 3 Fotos ausgewählt hat, dann sollte Firebase so aussehen.Firebase mehrere Bilder in Swift hochladen

"Post": { 
    "uid": { 
     "Text": "some text", 
     "imageUrl": "url", 
     "imageUrl2": "url2", 
     "imageUrl3": "url3" 
    } 
    } 

Aber es kommt so zurück. That tweetImageUrl ist die URL des dritten Fotos, die zuletzt ausgewählt wurde. auch im Speicher gibt es nur ein Foto, das auch das dritte Foto ist. image here

Wie kann ich Bilder korrekt hochladen? Hier ist mein Code.

func sendTweets() { 

     let text = textView.text 
     let tweetLength = textView.text.count 
     let imagesNumber = imagesArray.count 
     format.dateFormat = "yyyy-MM-dd HH:mm" 
     let strDate = format.string(from: date as Date) 
     let childRef = ref.child("TWEETS").child(uid!).childByAutoId() 
     let key = ref.child("TWEETS").child(uid!).childByAutoId().key 
     let childStorageRef = storageRef.child("tweetImage").child(uid!).child(key) 

    if(tweetLength>0 && imagesNumber>0) 
    { 

     for image in imagesArray { 

     let tweetImage = image 
     if let uploadData = UIImagePNGRepresentation(tweetImage) { 

     childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 
        if error != nil { 
         print("error") 
     } else { 

     if let imageUrl = metadata?.downloadURL()?.absoluteString { 
      let values = ["Text": text!, "tweetImageUrl": imageUrl, "Date": strDate] as [String : Any] 
      childRef.updateChildValues(values) 

       } 
      } 
      }) 
     } 
     } 
     dismiss(animated: true, completion: nil) 
    } 
     else if(tweetLength>0) 
     { 
      let values = ["Text": text!, "Date": strDate] as [String : Any] 

     childRef.updateChildValues(values) 

     dismiss(animated: true, completion: nil) 

     } 

     else if(imagesNumber>0) 
     { 

     for image in imagesArray { 

      let tweetImage = image 
      if let uploadData = UIImagePNGRepresentation(tweetImage) { 

      childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 
       if error != nil { 
        print("error") 
       } else { 

      if let imageUrl = metadata?.downloadURL()?.absoluteString { 
      let values = ["tweetImageUrl": imageUrl, "Date": strDate] as [String : Any] 
      childRef.updateChildValues(values) 
       } 
      } 
      }) 
     } 
     } 
     dismiss(animated: true, completion: nil) 
    } else { 
     alertTheUser(title: "error", message: "enter something.") 
    } 
}//func 

Auch wenn es darum geht, diese Bilder und die Anzeige auf der Sammlung Ansicht nach hochgeladen abzurufen, dann ist dies die richtige Art und Weise, dies zu erreichen? Vielen Dank im Voraus!

Antwort

0

Ich denke, das ist nicht die richtige Datenbankstruktur, der Sie bei der Verwendung von Firebase folgen sollten. Wenn Sie solche Bilder speichern, sagen Sie imageurl1, imageurl2 ..., usw. Es wäre wirklich schwierig, diese Werte zu holen, ohne den Schlüssel dafür zu kennen. ich Ihnen vorschlagen, eine Struktur wie

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

zu folgen, so wäre es einfach, diese URLs Sie

holen konnte die URLs anhängen, indem Sie

let postRef = Database.database().reference(withPath: "Post").child(uid).child("images") 
let autoID = postRef.childByAutoID().key 
postRef.child(autoID).setValue(url) 
+0

Vielen Dank Rozario !! Das ist so hilfreich. Funktioniert das auch für die Speicherung? – Daibaku

0

Dank Rozario Hilfe, dachte ich, es aus. Was ich vermisste war, dass ich AutoId nicht innerhalb von for-loop deklariert habe. Deshalb wurde der alte Wert durch einen neuen Wert ersetzt. Code unten funktionierte wie erwartet. Knoten sieht so aus. hoffe, es würde helfen.

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

Code unten.

func sendTweets() { 

      let text = textView.text 
      let tweetLength = textView.text.count 
      let imagesNumber = imagesArray.count 
      format.dateFormat = "yyyy-MM-dd HH:mm" 
      let strDate = format.string(from: date as Date) 
      let childRef = ref.child("TWEETS").child(uid!).childByAutoId() 

     if(tweetLength>0 && imagesNumber>0) 
     { 

      for image in imagesArray { 

      let postRef = childRef.child("tweetImageUrl") 
      let autoID = postRef.childByAutoId().key 
      let childStorageRef = storageRef.child("Images").child(uid!).child(autoID) 
      let tweetImage = image 

      if let uploadData = UIImagePNGRepresentation(tweetImage) { 

      childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 
         if error != nil { 
          print("error") 
      } else { 

      if let imageUrl = metadata?.downloadURL()?.absoluteString { 
       let values = ["Text": text!, "Date": strDate] as [String : Any] 
       let value = [autoID: imageUrl] as [String : Any] 
       childRef.updateChildValues(values) 
       postRef.updateChildValues(value) 
        } 
       } 
       }) 
      } 
      } 
      dismiss(animated: true, completion: nil) 
     } 
      else if(tweetLength>0) 
      { 
       let values = ["Text": text!, "Date": strDate] as [String : Any] 

      childRef.updateChildValues(values) 

      dismiss(animated: true, completion: nil) 

      } 

      else if(imagesNumber>0) 
      { 

      for image in imagesArray { 

       let postRef = childRef.child("tweetImageUrl") 
       let autoID = postRef.childByAutoId().key 
       let childStorageRef = storageRef.child("Images").child(uid!).child(autoID) 
       let tweetImage = image 

       if let uploadData = UIImagePNGRepresentation(tweetImage) { 

       childStorageRef.putData(uploadData, metadata: nil, completion: { (metadata, error) in 
        if error != nil { 
         print("error") 
        } else { 

       if let imageUrl = metadata?.downloadURL()?.absoluteString { 
       let values = ["Date": strDate] as [String : Any] 
       childRef.updateChildValues(values) 
       postRef.child(autoID).setValue(imageUrl) 
        } 
       } 
       }) 
      } 
      } 
      dismiss(animated: true, completion: nil) 
     } else { 
      alertTheUser(title: "error", message: "enter something.") 
     } 

    }//func 
Verwandte Themen