Как сохранить массив UIImage в хранилище Firebase (и базу данных для представления строк)? - PullRequest
0 голосов
/ 09 июля 2019

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

1 Ответ

0 голосов
/ 09 июля 2019

Ваша проблема внутри 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 операция

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...