如何将UIImage数组保存到Firebase存储(以及用于字符串表示的数据库)?

时间:2019-07-09 15:11:33

标签: arrays swift database firebase uiimage

我正在使用一种图像共享功能,在点击('handleShare')时,它应该将图像阵列保存到数据库(imageUrl)中,并以数据格式存储在存储器中。我相信这是DispatchGroup的实现,但是我一生无法理解为什么它没有节省。

注意:图像是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()
}

1 个答案:

答案 0 :(得分:0)

您的问题在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操作