with library glide from cache ios swift uiimage nsurl

ios - glide - swift image library



Cargando/Descargando imagen desde URL en Swift (29)

Me gustaría cargar una imagen desde una URL en mi aplicación, así que primero probé con Objective-C y funcionó, sin embargo, con Swift, tengo un error de compilación:

''imageWithData'' no está disponible: use la construcción del objeto ''UIImage (datos :)''

Mi función:

@IBOutlet var imageView : UIImageView override func viewDidLoad() { super.viewDidLoad() var url:NSURL = NSURL.URLWithString("http://myURL/ios8.png") var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil) imageView.image = UIImage.imageWithData(data)// Error here }

En Objective-C:

- (void)viewDidLoad { [super viewDidLoad]; NSURL *url = [NSURL URLWithString:(@"http://myURL/ios8.png")]; NSData *data = [NSData dataWithContentsOfURL:url]; _imageView.image = [UIImage imageWithData: data]; _labelURL.text = @"http://www.quentinroussat.fr/assets/img/iOS%20icon''s%20Style/ios8.png"; }

¿Puede alguien explicarme por qué el imageWithData: no funciona con Swift y cómo puedo resolver el problema?


Kingfisher es una de las mejores bibliotecas para cargar imágenes en URL.

URL de Github - Kingfisher

// If you want to use Activity Indicator. imageview_pic.kf.indicatorType = .activity imageview_pic.kf.setImage(with: URL(string: "Give your url string")) // If you want to use custom placeholder image. imageview_pic.kf.setImage(with: URL(string: "Give your url string"), placeholder: UIImage(named: "placeholder image name"), options: nil, progressBlock: nil, completionHandler: nil)


Aquí está el código de trabajo para cargar / descargar imágenes desde la URL. NSCache automáticamente y muestra la imagen del marcador de posición antes de descargar y cargar la imagen real (código Swift 4).

func NKPlaceholderImage(image:UIImage?, imageView:UIImageView?,imgUrl:String,compate:@escaping (UIImage?) -> Void){ if image != nil && imageView != nil { imageView!.image = image! } var urlcatch = imgUrl.replacingOccurrences(of: "/", with: "#") let documentpath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] urlcatch = documentpath + "/" + "/(urlcatch)" let image = UIImage(contentsOfFile:urlcatch) if image != nil && imageView != nil { imageView!.image = image! compate(image) }else{ if let url = URL(string: imgUrl){ DispatchQueue.global(qos: .background).async { () -> Void in let imgdata = NSData(contentsOf: url) DispatchQueue.main.async { () -> Void in imgdata?.write(toFile: urlcatch, atomically: true) let image = UIImage(contentsOfFile:urlcatch) compate(image) if image != nil { if imageView != nil { imageView!.image = image! } } } } } } }

Utilice de esta manera:

// Here imgPicture = your imageView // UIImage(named: "placeholder") is Display image brfore download and load actual image. NKPlaceholderImage(image: UIImage(named: "placeholder"), imageView: imgPicture, imgUrl: "Put Here your server image Url Sting") { (image) in }


¡Lo único que falta es un!

let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg"); var err: NSError? var imageData :NSData = NSData.dataWithContentsOfURL(url!,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err) var bgImage = UIImage(data:imageData!)


Envolví el código de las mejores respuestas a la pregunta en una clase única y reutilizable que extiende UIImageView, para que pueda usar directamente UIImageViews de carga asíncrona en su guión gráfico (o crearlas a partir del código).

Aquí está mi clase:

import Foundation import UIKit class UIImageViewAsync :UIImageView { override init() { super.init(frame: CGRect()) } override init(frame:CGRect) { super.init(frame:frame) } required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } func getDataFromUrl(url:String, completion: ((data: NSData?) -> Void)) { NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: url)!) { (data, response, error) in completion(data: NSData(data: data)) }.resume() } func downloadImage(url:String){ getDataFromUrl(url) { data in dispatch_async(dispatch_get_main_queue()) { self.contentMode = UIViewContentMode.ScaleAspectFill self.image = UIImage(data: data!) } } } }

y aquí está cómo usarlo:

imageView.downloadImage("http://www.image-server.com/myImage.jpg")


Para tu información: Para swift-2.0 Xcode7.0 beta2

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 self.image = UIImage(data: data!) } } } }


Puedes usar pod SDWebImage para lograr lo mismo. Es fácil de usar. Puedes obtener documentación aquí SDWebImage

Aquí está el código de ejemplo

self.yourImage.sd_setImage(with: NSURL(string: StrUrl as String ) as URL!, placeholderImage: placeholderImage, options: SDWebImageOptions(rawValue: 0), completed: { (image, error, cacheType, imageURL) in if( error != nil) { print("Error while displaying image" , (error?.localizedDescription)! as String) } })



Recomiendo usar la biblioteca de Kingfisher para descargar imágenes de forma asíncrona. La mejor parte sobre el uso de Kingfisher es que almacena en caché todas las imágenes descargadas de forma predeterminada con la url de la imagen como identificación. La próxima vez que solicite descargar una imagen con esa URl en particular, la cargará desde el caché.

Uso:

newsImage.kf.setImage(with: imageUrl!, placeholder: nil, options: nil, progressBlock: nil, completionHandler: { (image, error, cacheType, imageUrl) in if error == nil{ self.activityIndicator.stopAnimating() }else if error != nil{ self.activityIndicator.stopAnimating() } })


Si estás buscando una implementación muy simple. (Esto funcionó para mí en Swift 2)

let imageURL = NSURL(string: "https://farm2.staticflickr.com/1591/26078338233_d1466b7da2_m.jpg") let imagedData = NSData(contentsOfURL: imageURL!)! imageView?.image = UIImage(data: imagedData)

Implementé dentro de una vista de tabla con una celda personalizada que solo tiene una imagen

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell = tableView.dequeueReusableCellWithIdentifier("theCell", forIndexPath: indexPath) as! customTableViewCell let imageURL = NSURL(string: "https://farm2.staticflickr.com/1591/26078338233_d1466b7da2_m.jpg") let imagedData = NSData(contentsOfURL: imageURL!)! cell.imageView?.image = UIImage(data: imagedData) return cell }


Si solo desea cargar la imagen (¡de forma asíncrona!) , 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 úsalo de esta manera:

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


Swift 2.x responde que descarga imagen a archivo (a diferencia de la respuesta de Leo Dabus, que almacena la imagen en la memoria). Basado en la respuesta de Leo Dabus y en la respuesta de Rob de Obtenga los datos de NSURLSession DownloadTaskWithRequest del controlador de finalización :

// Set download vars let downloadURL = NSURL() // URL to download from let localFilename = "foobar.png" // Filename for storing locally // Create download request let task = NSURLSession.sharedSession().downloadTaskWithURL(downloadURL) { location, response, error in guard location != nil && error == nil else { print("Error downloading message: /(error)") return } // If here, no errors so save message to permanent location let fileManager = NSFileManager.defaultManager() do { let documents = try fileManager.URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: false) let fileURL = documents.URLByAppendingPathComponent(localFilename) try fileManager.moveItemAtURL(location!, toURL: fileURL) self.doFileDownloaded(fileURL, localFilename: localFilename) print("Downloaded message @ /(localFilename)") } catch { print("Error downloading message: /(error)") } } // Start download print("Starting download @ /(downloadURL)") task.resume() // Helper function called after file successfully downloaded private func doFileDownloaded(fileURL: NSURL, localFilename: String) { // Do stuff with downloaded image }


Swift 3 con manejo de errores

let url = URL(string: arr[indexPath.row] as! String) if url != nil { 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 { if data != nil { cell.imgView.image = UIImage(data:data!) }else{ cell.imgView.image = UIImage(named: "default.png") } } } }

Con extension

extension UIImageView { func setCustomImage(_ imgURLString: String?) { guard let imageURLString = imgURLString else { self.image = UIImage(named: "default.png") return } DispatchQueue.global().async { let data = try? Data(contentsOf: URL(string: imageURLString)!) DispatchQueue.main.async { self.image = data != nil ? UIImage(data: data!) : UIImage(named: "default.png") } } } }

Uso de la extensión

myImageView. setCustomImage ("url")


Swift 4

Este método descargará una imagen de un sitio web de forma asíncrona y la almacenará en caché:

func getImageFromWeb(_ urlString: String, closure: @escaping (UIImage?) -> ()) { guard let url = URL(string: urlString) else { return closure(nil) } let task = URLSession(configuration: .default).dataTask(with: url) { (data, response, error) in guard error == nil else { print("error: /(String(describing: error))") return closure(nil) } guard response != nil else { print("no response") return closure(nil) } guard data != nil else { print("no data") return closure(nil) } DispatchQueue.main.async { closure(UIImage(data: data!)) } }; task.resume() }

En uso:

getImageFromWeb("http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") { (image) in if let image = image { let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 200, height: 200)) imageView.image = image self.view.addSubview(imageView) } // if you use an Else statement, it will be in background }


Swift 4.1 He creado una función que solo pasa la URL de la imagen; la clave de caché después de generar la imagen la configura para completar el bloque.

class NetworkManager: NSObject { private var imageQueue = OperationQueue() private var imageCache = NSCache<AnyObject, AnyObject>() func downloadImageWithUrl(imageUrl: String, cacheKey: String, completionBlock: @escaping (_ image: UIImage?)-> Void) { let downloadedImage = imageCache.object(forKey: cacheKey as AnyObject) if let _ = downloadedImage as? UIImage { completionBlock(downloadedImage as? UIImage) } else { let blockOperation = BlockOperation() blockOperation.addExecutionBlock({ let url = URL(string: imageUrl) do { let data = try Data(contentsOf: url!) let newImage = UIImage(data: data) if newImage != nil { self.imageCache.setObject(newImage!, forKey: cacheKey as AnyObject) self.runOnMainThread { completionBlock(newImage) } } else { completionBlock(nil) } } catch { completionBlock(nil) } }) self.imageQueue.addOperation(blockOperation) blockOperation.completionBlock = { print("Image downloaded /(cacheKey)") } } } } extension NetworkManager { fileprivate func runOnMainThread(block:@escaping ()->Void) { if Thread.isMainThread { block() } else { let mainQueue = OperationQueue.main mainQueue.addOperation({ block() }) } } }


Swift 4.2 Xcode 10.1 Desde la extensión de vista de imagen URL de cadena

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() { 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) } }


Un método para obtener la imagen que es segura y funciona con Swift 2.0 y X-Code 7.1:

static func imageForImageURLString(imageURLString: String, completion: (image: UIImage?, success: Bool) -> Void) { guard let url = NSURL(string: imageURLString), let data = NSData(contentsOfURL: url), let image = UIImage(data: data) else { completion(image: nil, success: false); return } completion(image: image, success: true) }

Entonces llamaría a este método así:

imageForImageURLString(imageString) { (image, success) -> Void in if success { guard let image = image else { return } // Error handling here // You now have the image. } else { // Error handling here. } }

Si está actualizando la vista con la imagen, tendrá que usar esto después de "if success {":

dispatch_async(dispatch_get_main_queue()) { () -> Void in guard let image = image else { return } // Error handling here // You now have the image. Use the image to update the view or anything UI related here // Reload the view, so the image appears }

La razón por la que se necesita esta última parte si está usando la imagen en la interfaz de usuario es porque las llamadas de red llevan tiempo. Si intenta actualizar la interfaz de usuario usando la imagen sin llamar a dispatch_async como se muestra arriba, la computadora buscará la imagen mientras la imagen aún está siendo captada, encontrará que no hay imagen (todavía) y continuará como si no hubiera imagen encontró. Al poner el código dentro de un cierre de finalización de dispatch_async, se le dice a la computadora: "Ve, obtén esta imagen y cuando hayas terminado, completa este código". De esa manera, tendrá la imagen cuando se llame el código y las cosas funcionarán bien.


Utilizando Ascyimageview puedes cargar fácilmente imageurl en imageview.

let image1Url: URL = URL (string: "(imageurl)" como String)! imageview.imageURL = image1Url


(Actualización de Swift 4) Para responder directamente a la pregunta original, aquí está el equivalente veloz del fragmento de código 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!)

RENUNCIA:

Es importante tener en cuenta que el método Data(contentsOf:) descargará el contenido de la url de forma síncrona en el mismo hilo en el que se ejecuta el código, por lo que no lo invoque en el hilo principal de su aplicación.

Una forma fácil de hacer que el mismo código se ejecute de forma asíncrona, sin bloquear la interfaz de usuario, es mediante el uso de 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 las 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 que no solo se descarguen, sino que se almacenen en caché. Ya hay bastantes bibliotecas que lo hacen muy bien y todas son muy fáciles de usar. 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


Swift 2 con manejador de error y encabezado de solicitud personalizado

Simplemente agregue la extensión a UIImageView:

extension UIImageView { public func imageFromUrl(urlString: String) { if let url = NSURL(string: urlString) { let request = NSMutableURLRequest(URL: url) request.setValue("<YOUR_HEADER_VALUE>", forHTTPHeaderField: "<YOUR_HEADER_KEY>") NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error) in guard let data = data where error == nil else{ NSLog("Image download error: /(error)") return } if let httpResponse = response as? NSHTTPURLResponse{ if httpResponse.statusCode > 400 { let errorMsg = NSString(data: data, encoding: NSUTF8StringEncoding) NSLog("Image download error, statusCode: /(httpResponse.statusCode), error: /(errorMsg!)") return } } dispatch_async(dispatch_get_main_queue(), { NSLog("Image download success") self.image = UIImage(data: data) }) }.resume() } } }

Y luego, use el nuevo imageFromUrl(urlString: String) para descargar la imagen

Uso:

imageView.imageFromUrl("https://i.imgur.com/ONaprQV.png")


Swift 2.0:

1)

if let url = NSURL(string: "http://etc...") { if let data = NSData(contentsOfURL: url) { imageURL.image = UIImage(data: data) } }

O

imageURL.image = NSURL(string: "http:// image name...") .flatMap { NSData(contentsOfURL: $0) } .flatMap { UIImage(data: $0) }

2) Agregue este método a VC o Extensión.

func load_image(urlString:String) { let imgURL: NSURL = NSURL(string: urlString)! let request: NSURLRequest = NSURLRequest(URL: imgURL) NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response: NSURLResponse?, data: NSData?, error: NSError?) in if error == nil { self.image_element.image = UIImage(data: data) } } }

Uso:

self.load_image(" url strig here")


Swift 2.2 || Xcode 7.3

¡Conseguí resultados asombrosos !! con la biblioteca swift de AlamofireImage

Proporciona múltiples características como:

  • Descarga asíncrona
  • Auto Purging Image Cache si ocurren advertencias de memoria para la aplicación
  • URL de imagen en caché
  • Imagen de caché
  • Evite descargas duplicadas

y muy fácil de implementar para tu aplicación

Paso.1 instalar pods

Alamofire 3.3.x

vaina ''Alamofire''

AlamofireImage 2.4.x

pod ''AlamofireImage''

Paso 2 importación y uso

import Alamofire import AlamofireImage let downloadURL = NSURL(string: "http://cdn.sstatic.net/Sites//company/Img/photos/big/6.jpg?v=f4b7c5fee820")! imageView.af_setImageWithURL(downloadURL)

¡¡Eso es!! se encargará de todo

Muchas gracias a los chicos de Alamofire , por hacer la vida de iDevelopers fácil;)


Swift 4: un cargador simple para imágenes pequeñas (ej: miniaturas) que usa NSCache y siempre se ejecuta en el hilo principal:

class ImageLoader { private static let cache = NSCache<NSString, NSData>() class func image(for url: URL, completionHandler: @escaping(_ image: UIImage?) -> ()) { DispatchQueue.global(qos: DispatchQoS.QoSClass.background).async { if let data = self.cache.object(forKey: url.absoluteString as NSString) { DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) } return } guard let data = NSData(contentsOf: url) else { DispatchQueue.main.async { completionHandler(nil) } return } self.cache.setObject(data, forKey: url.absoluteString as NSString) DispatchQueue.main.async { completionHandler(UIImage(data: data as Data)) } } } }

Uso:

ImageLoader.image(for: imageURL) { image in self.imageView.image = image }


Swift 4 ::

Esto mostrará el cargador mientras se carga la imagen. Puedes usar NSCache que almacena imagen temporalmente

let imageCache = NSCache<NSString, UIImage>() extension UIImageView { func loadImageUsingCache(withUrl urlString : String) { let url = URL(string: urlString) if url == nil {return} self.image = nil // check cached image if let cachedImage = imageCache.object(forKey: urlString as NSString) { self.image = cachedImage return } let activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView.init(activityIndicatorStyle: .gray) addSubview(activityIndicator) activityIndicator.startAnimating() activityIndicator.center = self.center // if not, download image from url URLSession.shared.dataTask(with: url!, completionHandler: { (data, response, error) in if error != nil { print(error!) return } DispatchQueue.main.async { if let image = UIImage(data: data!) { imageCache.setObject(image, forKey: urlString as NSString) self.image = image activityIndicator.removeFromSuperview() } } }).resume() } }

Uso:-

truckImageView.loadImageUsingCache(withUrl: currentTruck.logoString)


Usa este código en Swift

imageView.image=UIImage(data: NSData(contentsOfURL: NSURL(string: "http://myURL/ios8.png")!)!


Xcode 8 • Swift 3

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 imagen de su url

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

Crear un método para descargar la imagen (iniciar 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() { 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") if let url = URL(string: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") { imageView.contentMode = .scaleAspectFit 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: UIViewContentMode = .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() { self.image = image } }.resume() } func downloaded(from link: String, contentMode mode: UIViewContentMode = .scaleAspectFit) { guard let url = URL(string: link) else { return } downloaded(from: url, contentMode: mode) } }

Uso:

imageView.downloaded(from: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png")


Xcode 8Swift 3

¡La respuesta de Leo Dabus es increíble! Solo quería proporcionar una solución de función todo en uno:

let url = URL(string: "http://www.apple.com/euro/ios/ios8/a/generic/images/og.png") let task = URLSession.shared.dataTask(with: url!) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async() { // execute on main thread self.imageView.image = UIImage(data: data) } } task.resume()


Para Swift-3 y superior:

extension UIImageView { public func imageFromUrl(urlString: String) { if let url = URL(string: urlString) { let request = URLRequest(url: url) NSURLConnection.sendAsynchronousRequest(request as URLRequest, queue: .main, completionHandler: { (response, data, error) in if let imageData = data as NSData? { self.image = UIImage(data: imageData as Data) } }) } } }


class func downloadImageFromUrl(with urlStr: String, andCompletionHandler:@escaping (_ result:Bool) -> Void) { guard let url = URL(string: urlStr) else { andCompletionHandler(false) return } DispatchQueue.global(qos: .background).async { URLSession.shared.dataTask(with: url, completionHandler: { (data, response, error) -> Void in if error == nil { let httpURLResponse = response as? HTTPURLResponse Utils.print( "status code ID : /(String(describing: httpURLResponse?.statusCode))") if httpURLResponse?.statusCode == 200 { if let data = data { if let image = UIImage(data: data) { ImageCaching.sharedInterface().setImage(image, withID: url.absoluteString as NSString) DispatchQueue.main.async { andCompletionHandler(true) } }else { andCompletionHandler(false) } }else { andCompletionHandler(false) } }else { andCompletionHandler(false) } }else { andCompletionHandler(false) } }).resume() } }

He creado una función de clase simple en mi clase Utils.swift para llamar a ese método al que simplemente puede acceder mediante classname.methodname y sus imágenes se guardan en NSCache usando la clase ImageCaching.swift

Utils.downloadImageFromUrl(with: URL, andCompletionHandler: { (isDownloaded) in if isDownloaded { if let image = ImageCaching.sharedInterface().getImage(URL as NSString) { self.btnTeam.setBackgroundImage(image, for: .normal) } }else { DispatchQueue.main.async { self.btnTeam.setBackgroundImage(#imageLiteral(resourceName: "com"), for: .normal) } } })

Codificación feliz. Aclamaciones:)


let url = NSURL.URLWithString("http://live-wallpaper.net/iphone/img/app/i/p/iphone-4s-wallpapers-mobile-backgrounds-dark_2466f886de3472ef1fa968033f1da3e1_raw_1087fae1932cec8837695934b7eb1250_raw.jpg"); var err: NSError? var imageData :NSData = NSData.dataWithContentsOfURL(url,options: NSDataReadingOptions.DataReadingMappedIfSafe, error: &err) var bgImage = UIImage(data:imageData)