如何在 Firebase 实时数据库中将图像 URL 数组分组在一起? (迅速)

2023-12-07

我有以下代码:

@IBAction func postFinalButton(_ sender: Any) {
        while index < ImagesOnClick.count {
            ProgressHUD.show()
            ProgressHUD.animationType = .circleRotateChase
            ProgressHUD.colorAnimation = #colorLiteral(red: 0.337254902, green: 0.6156862745, blue: 0.9803921569, alpha: 1)
            ProgressHUD.colorHUD = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
        guard let imageSelected = ImagesOnClick[index] else {
            print("Image is nil")
            return
        }
        index += 1
        guard let imageData = imageSelected.jpegData(compressionQuality: 0.4) else {
            print("This is nil")
            return
        }
        let storageRef = Storage.storage().reference(forURL: "gs://loginpage-227bd.appspot.com")
        let storageRefPosts = storageRef.child("posts").child(Auth.auth().currentUser!.uid)
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpg"
        storageRefPosts.putData(imageData, metadata: metadata, completion: {
            (storageMetaData, error) in
            if error != nil {
                
                print("error")
                return
            }
            print("blala")
            storageRefPosts.downloadURL(completion: { (url, error) in
                if let metaImageUrl = url?.absoluteString {
                    print(metaImageUrl)
                    self.sendDataToDatabase(photoUrl: metaImageUrl)
                    //self.performSegue(withIdentifier: "BackToHome", sender: self)
                }
            })
        })
        }
    }
    func sendDataToDatabase(photoUrl: String) {
        let ref = Database.database().reference()
        let postsRefrence = ref.child("posts")
        let newPostId = postsRefrence.childByAutoId().key
        let newPostsRefrence = postsRefrence.child(newPostId!)
        newPostsRefrence.setValue(["photoUrl": photoUrl], withCompletionBlock: {
            (error, ref) in
            if error != nil {
                ProgressHUD.showError(error?.localizedDescription)
                return
            }
            ProgressHUD.showSucceed()
        })
    }

我的模型看起来像这样:

Image

如果您查看数据库,您将看到 4 张不同的图像,每张图像都有一个单独的 ID。问题是我同时上传了这些图像。我正在尝试创建一个应用程序,您可以在其中发布图像然后查看它们。但是,如果我一起上传多个图像,它们将存储为完全独立的图像。我想要的是,如果用户上传一组图像,它们存储在一起,这样我就可以将它们作为一篇文章检索。我的问题是我该怎么做?

Edit

我已将代码更改为:

@IBAction func postFinalButton(_ sender: Any) {
        let ref = Database.database().reference()
        let postsReference = ref.child("posts")
        let newImagesRef = postsReference.childByAutoId()
        while index < ImagesOnClick.count {
            ProgressHUD.show()
            ProgressHUD.animationType = .circleRotateChase
            ProgressHUD.colorAnimation = #colorLiteral(red: 0.337254902, green: 0.6156862745, blue: 0.9803921569, alpha: 1)
            ProgressHUD.colorHUD = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)
        guard let imageSelected = ImagesOnClick[index] else {
            print("Image is nil")
            return
        }
        index += 1
        guard let imageData = imageSelected.jpegData(compressionQuality: 0.4) else {
            print("This is nil")
            return
        }
        let storageRef = Storage.storage().reference(forURL: "gs://loginpage-227bd.appspot.com")
        let storageRefPosts = storageRef.child("posts").child(Auth.auth().currentUser!.uid)
        let metadata = StorageMetadata()
        metadata.contentType = "image/jpg"
        storageRefPosts.putData(imageData, metadata: metadata, completion: {
            (storageMetaData, error) in
            if error != nil {
                
                print("error")
                return
            }
            print("blala")
            storageRefPosts.downloadURL(completion: { (url, error) in
                if let metaImageUrl = url?.absoluteString {
                    print(metaImageUrl)
                    self.sendDataToDatabase(photoUrl: metaImageUrl, ref: postsReference, index: self.index)
                    //self.performSegue(withIdentifier: "BackToHome", sender: self)
                }
            })
        })
        }
    }
    func sendDataToDatabase(photoUrl: String, ref: DatabaseReference, index: Int) {
        let name = "photoUrl"+String(index)
        ref.setValue([name: photoUrl], withCompletionBlock: {
            (error, ref) in
            if error != nil {
                ProgressHUD.showError(error?.localizedDescription)
                return
            }
            ProgressHUD.showSucceed()
        })
    }

但现在,当我按下帖子按钮时,仅保存最后选定的图像 url,而不是将每个帖子存储在新的 id 下,而是将其存储在 posts 子项下。这是它的外观图像:

Database Image


每次你打电话childByAutoId()它在数据库中生成一个新的唯一位置。既然你现在打电话childByAutoId()对于每个图像,每个图像都存储在其自己的自动 ID 下。

诀窍是只调用childByAutoId()所有图像一次。但这意味着您需要为每个图像使用另一个唯一的属性名称,因为它们不能全部被调用photoUrl(键在其父节点中必须是唯一的)。

一种方法是:

  1. Call childByAutoId()一旦在postFinalButton方法,并将结果密钥传递到sendDataToDatabase.
  2. 使用每个文件的索引作为其文件名的一部分,同时将该值传递给sendDataToDatabase.

像这样的东西在postFinalButton:

let ref = Database.database().reference()
let postsReference = ref.child("posts")
let newImagesRef = postsRefrence.childByAutoId()

...

storageRefPosts.putData(imageData, metadata: metadata, completion: {
    (storageMetaData, error) in
    if error != nil {            
        print("error")
        return
    }
    storageRefPosts.downloadURL(completion: { (url, error) in
        if let metaImageUrl = url?.absoluteString {
            self.sendDataToDatabase(photoUrl: metaImageUrl, newImagesRef, index)
        }
    })
})

进而:

func sendDataToDatabase(photoUrl: String, ref: DatabaseReference, index: int) {
    let name = "photoUrl"+String(index)
    ref.setValue([name: photoUrl], withCompletionBlock: {
        (error, ref) in
        if error != nil {
            ProgressHUD.showError(error?.localizedDescription)
            return
        }
        ProgressHUD.showSucceed()
    })
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Firebase 实时数据库中将图像 URL 数组分组在一起? (迅速) 的相关文章

随机推荐