2017-12-24 6 views
1

Ich arbeite an einer Social Media App. Ich habe die Profilseite erstellt. Ich habe es mit meiner Firebase-Datenbank verbunden. Aber ich möchte Profil Bild aus der Datenbank geladen werden.Firebase gibt keine URL an Swift zurück

In meiner Datenbank gibt es eine Profilbild-URL (die Firebase-Speicher-URL ist) und ich möchte es aus der Datenbank abrufen und das Bild auf dem Profilbild darstellen.

Und auch ich habe 3 Aktion Anfragen erstellt. Wenn der Benutzer auf die verfügbaren Optionen für Foto 3 klickt.

wählen neues Foto aus der Galerie

nehmen neue Fotokamera mit

anzeigen Foto

wegen, dass ich auch mein Bild möchte auf einen anderen

hier Ansicht übergeben werden ist ein Code :

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 

    profilePic.layer.cornerRadius = profilePic.frame.size.width/2 
    profilePic.clipsToBounds = true 
    getImages() 

} 


func getImages(){ 
    if FIRAuth.auth()?.currentUser?.uid==nil{ 
     self.performSegue(withIdentifier: "logOutSegue", sender: self) 
    } else { 
     let uid = FIRAuth.auth()?.currentUser?.uid 
     databaseRef.child("Users").child(uid!).observeSingleEvent(of: .value, with: { (snapshot) in 
      if let dict = snapshot.value as? NSDictionary{ 
       let ImageUrl = dict["Profpic"] as? String 
       print(ImageUrl) 
       let url = URL(string: ImageUrl!) 
       print(url) 
       URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in 
         if error != nil{ 
          print(error?.localizedDescription) 
          return 
         } 
         DispatchQueue.main.async { 
          self.profilePic?.image = UIImage(data: data!) 
         } 
       }).resume() 
      } 
     }) 
    } 
} 


@objc func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) { 
    let image = info[UIImagePickerControllerOriginalImage] as! UIImage 
    self.profilePic.image = image 
    picker.dismiss(animated: true, completion: nil) 
} 


func imagePickerControllerDidCancel(_ picker: UIImagePickerController) { 
    picker.dismiss(animated: true, completion: nil) 
} 



@IBAction func changePic(_ sender: Any) { 

    let imagePickerController = UIImagePickerController() 
    imagePickerController.delegate = self 

    let actionSheet = UIAlertController(title: "Foto Kaynağı", message: "Bir kaynak seçin", preferredStyle: .actionSheet) 

    actionSheet.addAction(UIAlertAction(title: "Kameranla yeni bir fotoğraf çek", style: .default, handler: { (action:UIAlertAction) in 

     if UIImagePickerController.isSourceTypeAvailable(.camera){ 
      imagePickerController.sourceType = .camera 
      self.present(imagePickerController, animated: true, completion: nil) 
     } 
     else { 
      print("Camera not available") 
     } 
    })) 

    actionSheet.addAction(UIAlertAction(title: "Galeriden yeni bir fotoğraf seç", style: .default, handler: { (action:UIAlertAction) in 
     imagePickerController.sourceType = .photoLibrary 
     self.present(imagePickerController, animated: true, completion: nil) 
    })) 

    actionSheet.addAction(UIAlertAction(title: "Fotoğrafı Göster", style: .default, handler: { (action:UIAlertAction) in 
     self.performSegue(withIdentifier: "showProfilePic", sender: self) 
    })) 

    actionSheet.addAction(UIAlertAction(title: "Geri Dön", style: .cancel, handler: nil)) 
    self.present(actionSheet, animated: true,completion: nil) 

} 



@IBAction func saveClicked(_ sender: Any) { 
    let imageName = NSUUID().uuidString 
    let storedImage = storageRef.child("Profile Pictures").child(imageName) 
    if let uploadData = UIImagePNGRepresentation(self.profilePic.image!){ 
     storedImage.put(uploadData, metadata: nil, completion: { (metadata, error) in 
      if error != nil { 
       print(error?.localizedDescription) 
       return 
      } 
      storedImage.downloadURL(completion: { (url, error) in 
       if error != nil { 
        print(error?.localizedDescription) 
        return 
       } 
       if let urlText = url?.absoluteString{ 
        self.databaseRef.child("Users").child((FIRAuth.auth()?.currentUser?.uid)!).updateChildValues(["ProfPic" : urlText], withCompletionBlock: { (error, ref) in 
         if error != nil{ 
          print(error?.localizedDescription) 
          return 
         } 
        }) 
       } 
      }) 
     }) 
    } 
} 
+1

Können Sie uns Ihre DB-Struktur zeigen? Wird Ihr observeSingleEvent-Trigger auch ausgelöst? – Christian

+0

Geben Ihre Druckanweisungen die erwarteten Werte aus? Was ist das Problem hier? Sie sollten Ihr Problem und Ihre Frage deutlicher machen. –

+0

Meine Druckanweisungen geben null zurück. Ich erwähnte es auch –

Antwort

1

Hier ist ein Beispiel für Sie. Ich verwende ein Wörterbuch, um die URL zu erhalten, und setze dann die UIImageView auf das Bild mit dem Befehl sd_setImage.

Hinweis: Bei Verwendung von Firebase müssen Sie keine URLSession oder DispatchQueue verwenden.

if let dictionary = snapshot.value as? [String: AnyObject] { 
     self.usernameLbl.text = dictionary["userName"] as? String 
     self.genderLbl.text = dictionary["gender"] as? String 
     self.ageLbl.text = dictionary["age"] as? String 
     self.bioLbl.text = dictionary["bio"] as? String 
     self.weightLbl.text = dictionary["weight"] as? String 
     self.heightLbl.text = dictionary["name"] as? String 

     let stringURL = NSURL(string: dictionary["profileImg"] as! String) 
     self.profileImg.sd_setImage(with: stringURL as URL?) 

      } 
+0

Um "sd_setImage" in ImageView zu verwenden, müssen Sie die Drittanbieterbibliothek SDWebImage verwenden. Das bietet auch Unterstützung für Image Caching. Sehen Sie sich https://github.com/rs/SDWebImage @Semih Gençer an –