如何将Firebase数据库中存储的URL用作UIImageView中的图像

问题描述 投票:0回答:1

我是编码和尝试构建iOS应用程序的新手。我将用户上传的图像存储到我的Firebase存储中,然后将URL保存为字符串(“ https // .....)。使用print(snapshot)之后,我可以获取快照以显示在项目终端中)。它会打印并捕捉(profileImageUrl)https://firebasestorage...。如何使用此快照获取ImageView以显示最近保存的个人资料图片?

import UIKit
import Firebase
import SDWebImage


class EditProfileViewController: UIViewController {

@IBOutlet weak var ProfileImage: UIImageView!

        var selectedImage: UIImage?

        var ref:DatabaseReference?

        var databaseHandle:DatabaseHandle = 0

        var postProfileImage = [String]()

let dbref = Database.database().reference()
let uid = Auth.auth().currentUser?.uid


        override func viewDidLoad() {
            super.viewDidLoad()
           self.ref?.child("users").child(Auth.auth().currentUser!.uid).child("profileImageUrl").observe(.value, with: { (snapshot) in
                print(snapshot)
           })


            ProfileImage.layer.borderWidth = 3.0
            ProfileImage.layer.masksToBounds = false
            ProfileImage.layer.borderColor = UIColor.white.cgColor
            ProfileImage.layer.cornerRadius = ProfileImage.frame.size.width / 2
            ProfileImage.clipsToBounds = true

            let tapGesture = UITapGestureRecognizer(target: self, action: #selector(EditProfileViewController.handleSelectProfileImageView))
            ProfileImage.addGestureRecognizer(tapGesture)
            ProfileImage.isUserInteractionEnabled = true
}

        @objc func handleSelectProfileImageView() {
        let pickerController = UIImagePickerController()
        pickerController.delegate = self
        present(pickerController, animated: true, completion: nil)

                    }

@IBAction func Cancel(_ sender: UIBarButtonItem) {
    dismiss(animated: true, completion: nil)

}

let user = Auth.auth().currentUser

let fileData = NSData()


@IBAction func DoneButton(_ sender: UIBarButtonItem) {
guard let imageSelected = self.ProfileImage.image else {
    print ("Avatar is nil")
    return
}

    var dict: Dictionary<String, Any> = [
        "profileImageUrl": "",

    ]

guard let imageData = imageSelected.jpegData(compressionQuality: 0.4) else {
    return
}
    let storageRef = Storage.storage().reference(forURL: "(I have my storage url here")
    let imageName = NSUUID().uuidString
    let storageProfileRef = storageRef.child("Profile_Images").child(Auth.auth().currentUser!.uid).child("\(imageName).png")

let metadata = StorageMetadata()
metadata.contentType = "image/jpeg"
storageProfileRef.putData(imageData, metadata: metadata, completion:
    { (StorageMetadata, error) in
        if (error != nil) {
            return
        }

        storageProfileRef.downloadURL { (url, error) in
            if let metaImageUrl = url?.absoluteString {
                dict["profileImageUrl"] = metaImageUrl

                Database.database().reference().child("users").child(Auth.auth().currentUser!.uid).updateChildValues(dict, withCompletionBlock:  {
                    (error, ref) in
                    if error == nil {
                        print("Done")
                    }
                    }

                )
            }
        }

})


    dismiss(animated: true, completion: nil)

      }

 }
     extension EditProfileViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
       func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
           //print("did Finish Picking Media")
           if let image = info[UIImagePickerController.InfoKey(rawValue: "UIImagePickerControllerOriginalImage")] as? UIImage{
               selectedImage = image
               ProfileImage.image = image
           }
           dismiss(animated: true, completion: nil)
       }
   }

我真的可以使用一些帮助!

swift firebase firebase-realtime-database uiimageview
1个回答
0
投票

您可以如下所示向UIImageView添加扩展名:

extension UIImageView {
    func load(url: URL, onLoadCompletion: ((_ isImageLoaded: Bool) -> Void)? = nil) {
        self.image = nil
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                        onLoadCompletion?(true)
                    }
                } else {
                    onLoadCompletion?(false)
                }
            } else {
                onLoadCompletion?(false)
            }
        }
    }
}

假设您的图像视图出口是这样的:

@IBOutlet weak var imageView: UIImageView!

以下是添加加载程序时的用法:

if let url = URL(string: "https://firebase-storage-url") {
    // show a loader here if needed
    imageView.load(url: url) { (imageLoaded) in
        if imageLoaded {
            // hide loader
        } else {
            // show a place holder image
            // hide loader
        }
    }
} else {
    // show a default image
}

下面是用法,无需任何额外的工作,仅加载图像:

if let url = URL(string: "https://firebase-storage-url") {
    imageView.load(url: url)
}
© www.soinside.com 2019 - 2024. All rights reserved.