【问题标题】:How to group an array of Image Urls together in Firebase Realtime Database? (Swift)如何在 Firebase 实时数据库中将一组图像 URL 组合在一起? (迅速)
【发布时间】:2023-03-23 16:14:01
【问题描述】:

我有以下代码:

@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()
        })
    }

我的模型看起来像这样:

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

编辑

我已将代码更改为:

@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 下,而是存储在帖子子项下。这是它的外观图片:

【问题讨论】:

    标签: swift database firebase firebase-realtime-database


    【解决方案1】:

    每次调用childByAutoId() 时,它都会在数据库中生成一个新的唯一位置。由于您现在为每张图片调用 childByAutoId(),因此每张图片都存储在自己的自动 ID 下。

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

    一种方法是:

    1. postFinalButton 方法中调用一次childByAutoId(),并将生成的密钥传递给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()
        })
    }
    

    【讨论】:

    • 请查看我的编辑,顺便说一下,我刚刚弄清楚为什么没有为每个帖子生成新的 id,但我仍然遇到问题,只显示最终图像 url 而不是全部他们。例如,如果有 4 张图片,我去发布它们,我只会在数据库中看到 photoURL4:。
    • 啊,我传递了对sendDataToDatabase 的错误引用。我现在更新了答案中的代码,但希望您能够根据我对流程如何工作的解释找出像这样的小错误。
    • 这不是我遇到的问题,问题是无论我做什么,只有一个 imageURL 被保存到 childbyautoid
    猜你喜欢
    • 1970-01-01
    • 2021-10-18
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-05
    • 2019-05-07
    • 1970-01-01
    • 2011-12-10
    相关资源
    最近更新 更多