Swift2 recuperando imágenes de Firebase

Intento leer / mostrar una imagen de Firebase. Primero estoy codificando la imagen y luego publicando esta cadena codificada en Firebase. Esto funciona bien. Cuando bash decodificar la cadena codificada de Firebase y convertirla en una imagen, obtengo una excepción de valor nulo.

Así es como estoy guardando la imagen en Firebase

var base64String: NSString! func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) { self.dismissViewControllerAnimated(true, completion: nil) imageToPost.image = image var uploadImage = image as! UIImage var imageData = UIImagePNGRepresentation(uploadImage)! self.base64String = imageData.base64EncodedStringWithOptions(NSDataBase64EncodingOptions.Encoding64CharacterLineLength) let ref = Firebase(url: "https://XXX.firebaseio.com") var quoteString = ["string": self.base64String] var usersRef = ref.childByAppendingPath("goalImages") var users = ["image": quoteString] usersRef.setValue(users) displayAlert("Image Posted", message: "Your image has been successfully posted!") } 

Así es como estoy tratando de leer la imagen de Firebase

 // ViewController.swift import UIKit import Firebase class ViewController: UIViewController { @IBOutlet weak var image: UIImageView! var base64String: NSString! @IBAction func buttonClicked(sender: AnyObject) { sender.setTitle("\(sender.tag)", forState: UIControlState.Normal) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. let ref = Firebase(url: "https://XXX.firebaseio.com/goalImages/image/string") ref.observeEventType(.Value, withBlock: { snapshot in self.base64String = snapshot.value as! NSString let decodedData = NSData(base64EncodedString: self.base64String as String, options: NSDataBase64DecodingOptions()) //Next line is giving the error var decodedImage = UIImage(data: decodedData!) self.image.image = decodedImage }, withCancelBlock: { error in print(error.description) }) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

El error dice: “error fatal: encontrado inesperadamente nulo mientras desenvuelve un valor opcional”; decodedData es nulo. ¿Podría alguien explicar qué está pasando mal?

En lugar de

 let decodedData = NSData(base64EncodedString: self.base64String as String, options: NSDataBase64DecodingOptions()) 

intente agregar IgnoreUnknownCharacters

 NSDataBase64DecodingOptions.IgnoreUnknownCharacters 

Ejemplo de uso: codifica un jpg, almacena y lee de firebase

codificar y escribir nuestro barco estrella favorito

  if let image = NSImage(named:"Enterprise.jpeg") { let imageData = image.TIFFRepresentation let base64String = imageData!.base64EncodedStringWithOptions(.Encoding64CharacterLineLength) let imageRef = myRootRef.childByAppendingPath("image_path") imageRef.setValue(base64String) 

leer y decodificar

  imageRef.observeEventType(.Value, withBlock: { snapshot in let base64EncodedString = snapshot.value let imageData = NSData(base64EncodedString: base64EncodedString as! String, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters) let decodedImage = NSImage(data:imageData!) self.myImageView.image = decodedImage }, withCancelBlock: { error in print(error.description) }) 

Firebase Engineer aquí:

Recomiendo usar la nueva API de Firebase Storage para cargar imágenes en Firebase. Es fácil de usar, de bajo costo y está respaldado por Google Cloud Storage a gran escala.

Puede cargar desde NSData o un NSURL apuntando a un archivo local (mostraré NSData , pero el principio es el mismo):

 // Data in memory let data: NSData = ... // Create a reference to the file you want to upload let riversRef = storageRef.child("images/rivers.jpg") // Upload the file to the path "images/rivers.jpg" let uploadTask = riversRef.putData(data, metadata: nil) { metadata, error in if (error != nil) { // Uh-oh, an error occurred! } else { // Metadata contains file metadata such as size, content-type, and download URL. let downloadURL = metadata!.downloadURL // This can be stored in the Firebase Realtime Database // It can also be used by image loading libraries like SDWebImage } } 

Incluso puedes pausar y reanudar las cargas, y puedes monitorear fácilmente las cargas para el progreso:

 // Upload data let uploadTask = storageRef.putData(...) // Add a progress observer to an upload task uploadTask.observeStatus(.Progress) { snapshot in // Upload reported progress if let progress = snapshot.progress { let percentComplete = 100.0 * Double(progress.completedUnitCount) / Double(progress.totalUnitCount) } }