Soy nuevo en firebase y tengo un problema aquí.
Ya he subido con éxito mi imagen al almacenamiento de Firebase, sin embargo, necesito obtener la URL de descarga de inmediato y publicarla en la base de datos. Y no estoy seguro de por qué no funciona dentro de ese cierre.
El siguiente es mi código:-
func CreateNewChatRoom(user: User, caption: String, data: Data){ let filePath = "\(user.uid)/\(Int(NSDate.timeIntervalSinceReferenceDate)).jpg" let metaData = StorageMetadata() metaData.contentType = "image/jpg" let reference = storageRef.child(filePath) reference.putData(data, metadata: metaData) { (metadata, error) in if let error = error { print("\(error.localizedDescription)") return } reference.downloadURL(completion: { (url, error) in if let error = error{ print("Error : \(error.localizedDescription)") return } else{ if let downloadURL = url?.absoluteString { let idRoom = self.BASE_REF.child("rooms").childByAutoId() idRoom.setValue(["caption":caption, "thumbnailUrlFromStorage": self.storageRef.child(metadata!.path!).description,"fileUrl": downloadURL]) } } }) } }Tengo el mismo problema, y encontré la siguiente solución, espero que le sea útil a alguien. rápido 5
importar FirebaseAuth importar FirebaseStorage importar FirebaseFirestore
typealias AddStoryResult = (Bool, ¿Error?) -> Void typealias UploadImageResult = (StorageMetadata?, ¿Error?) -> Void
clase StoryFirebaseAPI {
static let storage = Storage.storage() static var downloadUrlString: URL? var image: UIImage? let photoUri = "smth uri path" uploadImage(image, photoUriString: photoUri) { (metadata: StorageMetadata?, error: Error?) in guard let metadata = metadata else { if let error = error { print("Error occured: \(error)") } completion(false, error) return } // and at this point I have print(downloadUrlString) completion(true, nil) }}
extensión StoryFirebaseAPI {
func uploadImage(_ image: UIImage, photoUriString: String, completion: @escaping UploadImageResult) { guard let imageData = image.jpegData(compressionQuality: 0.5) else { print("smth error") completion(nil, nil) return } let storageRef = storage.reference().child(photoUriString) let imageMetadata = StorageMetadata() imageMetadata.contentType = "image/jpeg" storageRef.putData(imageData, metadata: imageMetadata) { (storageMetadata, error) in if let error = error { print("Error: \(error.localizedDescription)") completion(nil, error) return } guard let unwrappedMetadata = storageMetadata else { print("smth error") print("Error: \(error?.localizedDescription ?? "")") completion(nil, error) return } storageRef.downloadURL { url, error in if let error = error { print("Error: \(error.localizedDescription)") completion(nil, error) return } else { if let url = url { downloadUrlString = url completion(unwrappedMetadata, nil) } } } print("Image uploaded successfully") } }}