Как использовать обработчики завершения с методом .getData в Firebase Storage, чтобы выйти из асинхронного режима - PullRequest
0 голосов
/ 29 апреля 2020
func getData(maxSize size: Int64, completion: @escaping (Data?, Error?) -> Void) -> StorageDownloadTask

Так настроен метод .getData для Firebase Storage. Однако их пример для извлечения данных из хранилища выглядит следующим образом.

// Create a reference to the file you want to download
let islandRef = storageRef.child("images/island.jpg")

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
islandRef.getData(maxSize: 1 * 1024 * 1024) { data, error in
  if let error = error {
    // Uh-oh, an error occurred!
  } else {
    // Data for "images/island.jpg" is returned
    let image = UIImage(data: data!)
  }
}

Как видите, их пример для получения данных из хранилища Firebase вынимает обработчик завершения. Сейчас я работаю над инстаграм-приложением, которое создает посты с изображением и текстом. У меня есть загрузка данных в базу данных Firebase, и я могу успешно загрузить текст из базы данных Firebase, когда приложение закрыто и снова запущено.

Я также могу успешно загружать изображения в Firebase Storage, но у меня возникают проблемы с загрузкой этих изображений обратно, когда приложение закрыто и используется снова. Вот как выглядит мой .getData

func getPost() {
        postCollectionRef.getDocuments { (snapshot, error) in
            if let err = error {
                debugPrint("Error getting the data from firebase.")
            } else {
                for document in (snapshot?.documents)! {
                    let _data = document.data()
                    let _image = _data["image"] as? String ?? "Anonymous"
                    let _username = _data["username"] as? String ?? "Anonymous"
                    let _location = _data["location"] as? String ?? "Anonymous"
                    let _description = _data["description"] as? String ?? "Anonymous"
                    let _quantity = _data["quantity"] as? String ?? "Anonymous"
                    let _phone = _data["phone"] as? String ?? "Anonymous"
                    let _date = _data["date"] as? Date ?? Date()

                    // Points to the storage
                    let _storageRef = storage.reference()

                    // Points to the images folder
                    let _folderRef = _storageRef.child("images")

                    // Points to the the image under the images folder
                    let _fileRef = _folderRef.child("\(_image).jpg")

                    // File path is "images/whatever.jpg
                    let path = _fileRef.fullPath

                    var loadedImage: UIImage!

                    var temp: [UIImage] = []

                    //get the associated post image
                    _fileRef.getData(maxSize: 10 * 1024 * 1024) { (data, error) in
                        // Create a UIImage, add it to the array
                        if let error = error {
                            print(error)
                        } else {
                            let loadedImage = UIImage(data: data!)
                            temp.append(loadedImage!)
                        }

                    }

После некоторых исследований я обнаружил, что функции firebase асинхронны, поэтому их нельзя вкладывать. Это проблема? Что я могу сделать, чтобы решить эту проблему?

Моя основная проблема заключается в том, что он пропускает строку _fileRef.getData, и я не могу получить изображение из хранилища Firebase. Когда я устанавливаю точку останова на if let error = error, он фактически добавляет изображение к временному массиву! Однако, когда я пытаюсь выйти из закрытия _fileRef.getData, он продолжает переносить меня в разные файлы, но не позволяет мне шагнуть вперед. Сначала он переносит меня в FIRStorageReference.m, если я пытаюсь перешагнуть в этом файле, он переводит меня в 0 _dispatch_call_block_and_release, и это в значительной степени просто продолжается вечно и продолжает переходить в разные файлы.

...