我正在使用一种图像共享功能,在点击('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()
}
答案 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操作