Aún no conozco proyecto móvil que no requiera un poco de internet, ya sea para su creación o para su ejecución. Actualmente vivimos toto el tiempo conectados a decenas de servidores alrededor del mundo en un mismo segundo. Una de las primeras tareas que siempre tengo que hacer en mis proyectos es descargar contenido de internet. Una foto, una imagen de alguna publicación o tal vez una gráfica.
En este post mostrare como hacer la descarga de una imagen de forma asíncrona y mostrarla en la vista. Todo esto en Swift, el nuevo lenguaje de programación.
Primero crearemos el proyecto en Swift y escogemos “Single view application”
Después abrimos el archivo ViewController.swift aquí haremos 4 cosas.
- Declarar una propiedad de tipo NSData para almacenar el resultado y el queue que nos permitirá utilizarlo.
- Crear la función en la que haremos la petición para descargar la imagen.
- Definir una función en la que asignaremos el dato de la imagen y lo agregamos a la vista.
- Por ultimo conectaremos la función que ocupará los NSOperation y el NSOperationQueue.
Código final
// // ViewController.swift // AsyncOperation // // Created by Francisco Granados on 13/10/14. // Copyright (c) 2014 RIActive. All rights reserved. // import UIKit class ViewController: UIViewController { var data: NSData? var queue: NSOperationQueue? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. queue = NSOperationQueue() queue?.name = "mx.riactive.ui-thread" queue?.maxConcurrentOperationCount = 2 performOperation() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } func requestImageWithStringURL(stringURL: String) { let url = NSURL(string: stringURL) data = NSData(contentsOfURL: url) } func addImage() { let imageV = UIImageView(frame: CGRectMake(0, 0, 300, 400)) imageV.image = UIImage(data: data!) imageV.backgroundColor = UIColor(red: 100, green: 0, blue: 0, alpha: 1) view.addSubview(imageV) } func performOperation() { let operation = NSBlockOperation { () -> Void in self.requestImageWithStringURL("http://riactive.mx/wp-content/uploads/2014/07/swift-hero.png") NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in self.addImage() }) } operation.queuePriority = NSOperationQueuePriority.High queue?.addOperation(operation) } }
Conclusión
Como podemos darnos cuenta, nosotros (debemos) descargar imágenes fuera del hilo principal (main thread) pero es necesario regresar a el cuando necesitamos modificar el UI de nuestra aplicación.
También es importante notar la sintaxis de los bloques y su uso en la API de Cocoa ya que en Swift cambia para volverla mucho más amigable y sencilla.
Espero que este ejemplo les sirva y si tienen alguna duda o comentario aquí y en mi twitter los estaré leyendo.