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.