Quantcast
Channel: RIActive » iOS
Viewing all articles
Browse latest Browse all 3

Descargar una imagen con NSOperation y Swift

$
0
0

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.

Downloads

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”

Project template

Después abrimos el archivo ViewController.swift aquí haremos 4 cosas.

  1. Declarar una propiedad de tipo NSData para almacenar el resultado y el queue que nos permitirá utilizarlo.

    paso 1

    Paso 1

  2. Crear la función en la que haremos la petición para descargar la imagen.

    Paso 2

    Paso 2

  3. Definir una función en la que asignaremos el dato de la imagen y lo agregamos a la vista.

    Paso 3

    Paso 3

  4. Por ultimo conectaremos la función que ocupará los NSOperation y el NSOperationQueue.

    Paso 4

    Paso 4

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.


Viewing all articles
Browse latest Browse all 3

Trending Articles