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 (data :)'
Mi funcion:
@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 el objetivo-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é imageWithData:
no funciona con Swift y cómo puedo resolver el problema?
imageURL.image = UIImage(data: myDataVar)
Respuestas:
Xcode 8 o posterior • Swift 3 o posterior
Sincrónicamente:
Asincrónicamente:
Cree un método con un controlador de finalización para obtener los datos de imagen de su URL
Cree un método para descargar la imagen (comience la tarea)
Uso:
Extensión :
Uso:
fuente
UITableView
donde una celda muestra una imagen y la imagen se actualiza cuando se devuelve la celda en cola. Si el proceso n. ° 1 demora más que el proceso n. ° 2, el proceso n. ° 2 mostrará su imagen y luego se actualizará con el proceso n. ° 1 aunque esa imagen ya no sea válida para el usuario.(Actualización de Swift 4) Para responder directamente a la pregunta original, aquí está el equivalente rápido del fragmento de Objective-C publicado.
DESCARGO DE RESPONSABILIDAD:
Es importante tener en cuenta que el
Data(contentsOf:)
método descargará los contenidos de la url sincrónicamente en el mismo hilo en el que se está ejecutando el código, así que no invoque esto en el hilo principal de su 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 el uso de GCD:
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 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 :
Y eso es
fuente
image.url
por cualquier url de cadena, codificado o no :)URLSession.dataTask
porque muchas otras respuestas aquí ya muestran cómo hacerlo, es mejor mantener abiertas las diferentes opciones.Si solo desea cargar la imagen (¡Asincrónicamente!) , Simplemente agregue esta pequeña extensión a su código rápido:
Y úsalo de esta manera:
fuente
cancel
botón deje de descargar. ¿Tienes alguna idea de cómo puedo hacer esto con este método? Necesito agregar la funcionalidad de cancelar.Swift 2.2 || Xcode 7.3
Proporciona múltiples funciones como:
y muy fácil de implementar para tu aplicación
Paso.1 Instalar pods
Alamofire 3.3.x
AlamofireImage 2.4.x
Paso.2 importar y usar
¡¡Eso es!! se encargará de todo
Muchas gracias a los muchachos de Alamofire , por hacer que la vida de iDevelopers sea fácil;)
fuente
Xcode 8 • Swift 3
¡La respuesta de Leo Dabus es asombrosa! Solo quería proporcionar una solución de función todo en uno:
fuente
Envolví el código de las mejores respuestas a la pregunta en una sola clase reutilizable que extiende UIImageView, para que pueda usar directamente UIImageViews de carga asincrónica en su guión gráfico (o crearlos desde el código).
Aquí está mi clase:
y aquí está cómo usarlo:
fuente
Swift 4: ::
Esto mostrará el cargador mientras carga la imagen. Puede usar NSCache que almacena la imagen temporalmente
Uso:-
fuente
fuente
fatal error: unexpectedly found nil while unwrapping an Optional value
FYI: Para swift-2.0 Xcode7.0 beta2
fuente
Swift 3 con manejo de errores
Con extensión
Uso de extensión
Con soporte de caché
fuente
Swift 4: un cargador simple para imágenes pequeñas (ej .: miniaturas) que usa NSCache y siempre se ejecuta en el hilo principal:
Uso:
fuente
class
.Querrás hacer:
En Swift, han reemplazado la mayoría de los métodos de fábrica de Objective C con constructores regulares.
Ver:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
fuente
+(instancetype)[MyThing thingWithOtherThing:]
, también lo llamaría comoMyThing(otherThing: ...)
en Swift.Swift 2 con controlador de error y encabezado de solicitud personalizado
Simplemente agregue la extensión a UIImageView:
Y luego, usa la nueva
imageFromUrl(urlString: String)
imagen para descargarUso:
fuente
Swift 4
Este método descargará una imagen de un sitio web de forma asíncrona y la almacenará en caché:
En uso:
fuente
Swift 2.0:
1)
O
2) Agregue este método a VC o Extension.
Uso:
fuente
URL de Github: https://github.com/onevcat/Kingfisher
fuente
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).
Usar así:
fuente
Un método para obtener una imagen segura y que funcione con Swift 2.0 y X-Code 7.1:
Entonces llamarías a este método así:
Si está actualizando la vista con la imagen, deberá usarla después de "if success {":
La razón por la que se necesita esta última parte si está utilizando la imagen en la interfaz de usuario es porque las llamadas de red toman tiempo. Si intenta actualizar la interfaz de usuario utilizando la imagen sin llamar a dispatch_async como se indicó anteriormente, la computadora buscará la imagen mientras la imagen aún se está recuperando, encontrará que no hay imagen (todavía) y continuará como si no hubiera imagen encontró. Poner su código dentro de un cierre de finalización de dispatch_async le dice a la computadora: "Vaya, obtenga esta imagen y cuando haya terminado, luego complete este código". De esa manera, tendrá la imagen cuando se llame al código y las cosas funcionarán bien.
fuente
Si está buscando una implementación muy muy simple. (Esto funcionó para mí en Swift 2)
Implementé dentro de una vista de tabla con una celda personalizada que solo tiene una imagen
fuente
Recomiendo usar la biblioteca Kingfisher para descargar imágenes de forma asincrónica. 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 id. La próxima vez que solicite descargar una imagen con esa URL en particular, la cargará de la memoria caché.
Uso:
fuente
Puedes usar pod
SDWebImage
para lograr lo mismo. Es fácil de usar. Puedes obtener documentación aquí SDWebImageAquí está el código de ejemplo
fuente
rápido 5
Para usar
fuente
¡Lo único que falta es un!
fuente
Respuesta Swift 2.x que descarga la imagen al archivo (a diferencia de la respuesta de Leo Dabus, que almacena la imagen en la memoria). Basado en la respuesta de Leo Dabus y la respuesta de Rob de Obtener los datos de NSURLSession DownloadTaskWithRequest del controlador de finalización :
fuente
Swift 4.1 He creado una función solo pasa la url de la imagen, la clave de caché después de que se genera la imagen la configuró en el bloque de finalización.
fuente
He creado una función de clase simple en mi
Utils.swift
clase para llamar a ese método al que simplemente puede accederclassname.methodname
y sus imágenes se guardan en NSCache usando laImageCaching.swift
claseFeliz codificación. Salud:)
fuente
Swift 4.2 y AlamofireImage
Si usar una biblioteca no es un problema, puede hacerlo con la ayuda de
AlamofireImage
. mis muestras son de su GithubEjemplo de imágenes de marcador de posición:
Tiene muchas funciones útiles y extensión para trabajar con imágenes. desde el almacenamiento en caché hasta escalar y cambiar el tamaño o incluso aplicar filtros en la imagen. Si las imágenes son importantes en su aplicación, le sugiero que use este marco y ahorre tiempo.
fuente
El uso de Ascyimageview puede cargar fácilmente imageurl en imageview.
deje que image1Url: URL = URL (string: "(imageurl)" como String)! imageview.imageURL = image1Url
fuente
Carga de imagen desde el servidor: -
Uso: -
fuente
Para un mejor rendimiento
UITableView
oUICollectionView
uso de la biblioteca de peso ligero Carga diferida inteligente Puede usar este enfoque de carga diferida si desea cargar imágenes desde la URL AsíncronoSmart 'Lazy Loading' en
UICollectionView
oUITableView
usandoNSOperation
yNSOperationQueue
en iOS Por lo tanto, en este proyecto podemos descargar las imágenes múltiples en cualquier Vista (UICollectionView
oUITableView
) optimizando el rendimiento de una aplicación usandoOperation
yOperationQueue
para concurrencia. Los siguientes son los puntos clave de este proyecto Smart Lazy Loading: Creación del servicio de descarga de imágenes. Priorice la descarga en función de la visibilidad de las celdas.La clase ImageDownloadService creará una instancia singleton y tendrá una instancia NSCache para almacenar en caché las imágenes que se han descargado. Hemos heredado la clase Operation a TOperation para modificar la funcionalidad de acuerdo con nuestras necesidades. Creo que las propiedades de la subclase de operación son bastante claras en términos de funcionalidad. Estamos monitoreando los cambios de estado de las operaciones mediante el uso de KVO.
fuente