Я работаю над функцией обмена изображениями, которая при нажатии ('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()
}