arrays - 如何将 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()
}
解决方案
您的问题在里面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 操作
推荐阅读
- json - 无法使用 sparkDataframe 获取 Json 列:org.apache.spark.sql.AnalysisException:无法解析 'explode;
- firebase - JavaScript 中的 Firebase API 并因此公开,是否关注 Auth?
- python - 代码不会读取同一目录中的文件夹
- loops - 如何在 Python 3 中为图形循环分配多个变量
- sql - 如何为以下情况构建 SQL Case 语句?
- android - 从 Firebase 中的 Child 获取价值到 Android Studio
- android - Android Room:类型不匹配:推断类型为 java.util.Observer
- python-3.x - 如何在 Jupyter 笔记本中直接将主机变量作为 SQL 变量值传递?
- python - 使用 Firebase 时出现 401 客户端错误
- python - ImportError:无法从“user.serializers”导入名称“UserSerializer”