2017-12-24 25 views
1

私はソーシャルメディアアプリを開発中です。プロファイルページを作成しました。 Firebaseデータベースに接続しました。しかし、私はプロファイルの画像をデータベースからロードしたい。FirebaseがSwiftにURLを返さない

私のデータベースには、プロファイルpic url(firebase storage url)があります。データベースから取得して、プロファイルの画像を表したいと思います。

また、私は3つのアクションリクエストを作成しました。ユーザーが写真をクリックすると、利用可能な3つのオプションが表示されます。私も私のイメージはここに別のビュー

に渡すことがしたいことのため

ギャラリー

から新しい写真を選択して、カメラ

ショーの写真

を使用して新しい写真を撮るいくつかのコードです:

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

DB構造を表示できますか? observeSingleEventトリガーもですか? – Christian

+0

あなたのプリントステートメントが期待値を出力していますか?ここでの問題は何ですか?問題と疑問をより明確にする必要があります。 –

+0

私のprintステートメントはnilを返します。私もそれを言った –

答えて

1

次に例を示します。私は辞書を使用してURLを取得し、sd_setImageコマンドでUIImageViewをイメージに設定します。

注:Firebaseを使用する場合は、URLSessionまたはDispatchQueueを使用する必要はありません。

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

ImageViewで "sd_setImage"を使用するには、SDWebImageというサードパーティライブラリを使用する必要があります。 Image Cachingのサポートも提供します。 https://github.com/rs/SDWebImage @SemihGençerをご覧ください –

関連する問題