Я загружаю файлы в Firebase Storage, и мне нужно дождаться завершения загрузки файла и вернуть URL-путь к файлам.
Мой текущий код вызывает uploadImage и требует возврата строки URL. Однако код возвращается до того, как файл будет полностью загружен, а затем, как только файл будет загружен, выполняется storageReference.downloadURL и устанавливается imageURL. Итак, код работает, мне нужно, чтобы он приостановил загрузку файлов, а затем вернул URL-адрес. Любые идеи приветствуются!
//
// FirebaseStorage.swift
// ItemizePro
//
// Created by Tyler Wasick on 6/14/20.
// Copyright © 2020 Tyler Wasick. All rights reserved.
//
import Foundation
import FirebaseFirestore
import FirebaseAuth
import Firebase
class FirebaseStorageService {
// Upload image to Firebase Storage
static func uploadImage(image:UIImage, fileType:String) -> String {
// Image URL (String)
var imageURL = ""
if Auth.auth().currentUser != nil {
// Get UID
let uid = Auth.auth().currentUser?.uid
// Setup variables
let fileName = UUID().uuidString
// Create a Firebase Storage reference
let storageReference = Storage.storage().reference().child("\(fileType)/\(uid!)/\(fileName).jpg")
// Uploads the image to Firebase Storage
let photoData = image.jpegData(compressionQuality: 0.1)
guard photoData != nil else {
print("No photo provided")
return "NoPhoto"
}
storageReference.putData(photoData!, metadata: nil) { (metadata, err) in
// Check for upload errors
if err != nil {
// If an error has occured, print the error (to console) and return
print(err!)
return
}
else {
// Set image URL
storageReference.downloadURL { (url, err) in
// Check for errors
if err != nil {
// If an error has occured, print the error (to console) and return
print(err!)
return
}
else {
print("Upload successful!")
imageURL = url!.absoluteString
}
}
}
}
// Returns a string of the url location
return imageURL
}
return imageURL
}
}