Saltar al contenido

Cargando / Descargando imagen de URL en Swift

No busques más por otras páginas porque llegaste al sitio justo, tenemos la respuesta que necesitas recibir y sin liarte.

Xcode 8 o posterior • Swift 3 o posterior

Sincrónicamente:

if let filePath = Bundle.main.path(forResource: "imageName", ofType: "jpg"), let image = UIImage(contentsOfFile: filePath) 
    imageView.contentMode = .scaleAspectFit
    imageView.image = image

Asincrónicamente:

Cree un método con un controlador de finalización para obtener los datos de la imagen de su URL

func getData(from url: URL, completion: @escaping (Data?, URLResponse?, Error?) -> ()) 
    URLSession.shared.dataTask(with: url, completionHandler: completion).resume()

Crea un método para descargar la imagen (inicia la tarea)

func downloadImage(from url: URL) 
    print("Download Started")
    getData(from: url)  data, response, error in
        guard let data = data, error == nil else  return 
        print(response?.suggestedFilename ?? url.lastPathComponent)
        print("Download Finished")
        DispatchQueue.main.async()  [weak self] in
            self?.imageView.image = UIImage(data: data)
        
    

Uso:

override func viewDidLoad() 
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    print("Begin of code")
    let url = URL(string: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")! 
    downloadImage(from: url)
    print("End of code. The image will continue downloading in the background and it will be loaded when it ends.")


Extensión:

extension UIImageView 
    func downloaded(from url: URL, contentMode mode: UIView.ContentMode = .scaleAspectFit) 
        contentMode = mode
        URLSession.shared.dataTask(with: url)  data, response, error in
            guard
                let httpURLResponse = response as? HTTPURLResponse, httpURLResponse.statusCode == 200,
                let mimeType = response?.mimeType, mimeType.hasPrefix("image"),
                let data = data, error == nil,
                let image = UIImage(data: data)
                else  return 
            DispatchQueue.main.async()  [weak self] in
                self?.image = image
            
        .resume()
    
    func downloaded(from link: String, contentMode mode: UIView.ContentMode = .scaleAspectFit)  
        guard let url = URL(string: link) else  return 
        downloaded(from: url, contentMode: mode)
    

Uso:

imageView.downloaded(from: "https://cdn.arstechnica.net/wp-content/uploads/2018/06/macOS-Mojave-Dynamic-Wallpaper-transition.jpg")

(Actualización de Swift 4)
Para responder directamente a la pregunta original, aquí está el equivalente rápido del fragmento de Objective-C publicado.

let url = URL(string: image.url)
let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
imageView.image = UIImage(data: data!)

DESCARGO DE RESPONSABILIDAD:

Es importante tener en cuenta que el Data(contentsOf:) El método descargará el contenido de la URL. sincrónicamente en el mismo hilo se está ejecutando el código, por lo que no invoca esto en el hilo principal de tu aplicación.

Una manera fácil de hacer que el mismo código se ejecute de forma asincrónica, sin bloquear la interfaz de usuario, es mediante GCD:

let url = URL(string: image.url)

DispatchQueue.global().async 
    let data = try? Data(contentsOf: url!) //make sure your image in this url does exist, otherwise unwrap in a if let check / try-catch
    DispatchQueue.main.async 
        imageView.image = UIImage(data: data!)
    

Dicho esto, en aplicaciones de la vida real, si desea tener la mejor experiencia de usuario y evitar múltiples descargas de la misma imagen, es posible que también desee tenerlas no solo descargadas, sino también almacenadas en caché. Ya hay bastantes bibliotecas que lo hacen sin problemas y todas son realmente fáciles de usar. Yo personalmente recomiendo Kingfisher:

import Kingfisher

let url = URL(string: "url_of_your_image")
// this downloads the image asynchronously if it's not cached yet
imageView.kf.setImage(with: url) 

Y eso es

Si solo quieres cargar una imagen (¡Asincrónicamente!) – simplemente agregue esta pequeña extensión a su código Swift:

extension UIImageView 
    public func imageFromUrl(urlString: String) 
        if let url = NSURL(string: urlString) 
            let request = NSURLRequest(URL: url)
            NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) 
                (response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
                if let imageData = data as NSData? 
                    self.image = UIImage(data: imageData)
                
            
        
    

Y utilícelo de esta manera:

myImageView.imageFromUrl("https://robohash.org/123.png")

Si te gustó nuestro trabajo, tienes la habilidad dejar una sección acerca de qué te ha parecido este post.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *