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, и это в значительной степени просто продолжается вечно и продолжает переходить в разные файлы.