首页 > 解决方案 > 如何将 UIImage 数组保存到 Firebase 存储(以及用于字符串表示的数据库)中?

问题描述

我正在开发一个图像共享功能,点击('handleShare')它应该将一组图像保存到数据库(imageUrl)中,并将它们以数据格式存储在存储中。我相信这是一个 DispatchGroup 实现,但我一生都无法理解为什么它不能保存。

注意:images 是 UIImages 的数组,由用户在 didFinishPickingWithOptions 中选择,并且每次在 ImagePicker() 中选择图像时附加。

应用程序:这是针对同行市场的列表/帖子。想想 Instagram 用户可以选择多张图像的方式,它们都必须被保存。

var imageUrlArray = [String]()

@objc func handleShare() {
    saveImageDetailsToStorage()

    dispatchGroup.notify(queue: .main) {
        self.saveItemDetailsToDatabaseWithUrl(images: self.imageUrlArray)
    }
}

fileprivate func saveImageDetailsToStorage() {

    dispatchGroup.enter()
    guard let title = itemTitle.text, !title.isEmpty else { return }
    guard let price = priceTitle.text, !price.isEmpty else { return }
    //        guard let category = categoryTitle.text, !category.isEmpty else { return }
    //        let image = images[images.count - 1]

    navigationItem.rightBarButtonItem?.isEnabled = false
    navigationController?.toolbar.isUserInteractionEnabled = false

    let filename = NSUUID().uuidString

    for image in images {
        guard let uploadData = image.jpegData(compressionQuality: 0.3) else { return }
        let storageRef = Storage.storage().reference().child("posts").child(filename)
        storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
            if let err = error {
                print("Failed to upload image to Storage:", err)
                return
            }
            storageRef.downloadURL(completion: { (downloadURL, error) in
                if let err = error {
                    print("Failed to retrieve downloaded url:", err)
                    return
                }
                guard let imageUrl = downloadURL?.absoluteString else { return }
                self.imageUrlArray.append(imageUrl)
                print("Successfully uploaded post images:", self.imageUrlArray)

            })

        }
    }
    self.dispatchGroup.leave()
}

fileprivate func saveItemDetailsToDatabaseWithUrl(images: [String]) {
    dispatchGroup.enter()
    guard let title = itemTitle.text else { return }
    guard let price = priceTitle.text else { return }

    guard let uid = Auth.auth().currentUser?.uid else { return }

    let userPostRef = Database.database().reference().child("posts").child(uid)
    // This generates a random post id to save in the database
    let ref = userPostRef.childByAutoId()

    let values = ["postImageUrl": images, "postTitle": title, "price": price, "creationDate": Date().timeIntervalSince1970] as [String: Any]

    // Update the values in the dictionary with post details
    ref.updateChildValues(values) { (error, ref) in
        if let err = error {
            // If it fails re-activate share button...
            self.navigationItem.rightBarButtonItem?.isEnabled = true
            print("Failed to update child values:", err)
            return
        }
        print("Successfully saved")
        self.dismiss(animated: true, completion: nil)
    }
    dispatchGroup.leave()
}

标签: arraysswiftdatabasefirebaseuiimage

解决方案


您的问题在里面saveImageDetailsToStorage(下面的轨道编号从 1-3 正确设置)

@objc func handleShare() {
 saveImageDetailsToStorage() 
 dispatchGroup.notify(queue: .main) {   ////////////  1
     self.saveItemDetailsToDatabaseWithUrl(images: self.imageUrlArray)
    }
}
fileprivate func saveImageDetailsToStorage() {

    guard let title = itemTitle.text, !title.isEmpty else { return }
    guard let price = priceTitle.text, !price.isEmpty else { return }
    //        guard let category = categoryTitle.text, !category.isEmpty else { return }
    //        let image = images[images.count - 1]

    navigationItem.rightBarButtonItem?.isEnabled = false
    navigationController?.toolbar.isUserInteractionEnabled = false

    let filename = NSUUID().uuidString

    for image in images {

        guard let uploadData = image.jpegData(compressionQuality: 0.3) else { return }
        let storageRef = Storage.storage().reference().child("posts").child(filename)
        dispatchGroup.enter()       /////////////  2
        storageRef.putData(uploadData, metadata: nil) { (metadata, error) in
            if let err = error {
                print("Failed to upload image to Storage:", err)
                return
            }
            storageRef.downloadURL(completion: { (downloadURL, error) in
                if let err = error {
                    print("Failed to retrieve downloaded url:", err)
                    return
                }
                guard let imageUrl = downloadURL?.absoluteString else { return }
                self.imageUrlArray.append(imageUrl)
                print("Successfully uploaded post images:", self.imageUrlArray)
                 self.dispatchGroup.leave() //////////// 3
            })

        }
    }

}

但是在里面saveItemDetailsToDatabaseWithUrl你不需要调度,因为它是 1 操作


推荐阅读