Je voudrais charger une image à partir d'une URL dans mon application, j'ai donc d'abord essayé avec Objective-C et cela a fonctionné, cependant, avec Swift, j'ai une erreur de compilation:
'imageWithData' n'est pas disponible: utilisez la construction d'objet 'UIImage (data :)'
Ma fonction:
@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
}
Dans l'objectif-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";
}
Quelqu'un peut-il m'expliquer pourquoi imageWithData:
cela ne fonctionne pas avec Swift et comment puis-je résoudre le problème?
imageURL.image = UIImage(data: myDataVar)
Réponses:
Xcode 8 ou version ultérieure • Swift 3 ou version ultérieure
Synchrone:
De manière asynchrone:
Créez une méthode avec un gestionnaire d'achèvement pour obtenir les données d'image de votre URL
Créer une méthode pour télécharger l'image (démarrer la tâche)
Usage:
Extension :
Usage:
la source
UITableView
endroit où une cellule affiche une image et l'image est mise à jour lorsque la cellule retirée de la file d'attente est renvoyée. Si le processus n ° 1 prend plus de temps que le processus n ° 2, le processus n ° 2 affichera son image et il sera ensuite mis à jour par le processus n ° 1 même si cette image n'est plus valide pour l'utilisateur.(Mise à jour Swift 4) Pour répondre directement à la question d'origine, voici l'équivalent rapide de l'extrait Objective-C publié.
AVERTISSEMENT:
Il est important de noter que la
Data(contentsOf:)
méthode télécharge le contenu de l'URL de manière synchrone dans le même thread que le code en cours d'exécution, donc ne l' invoquez pas dans le thread principal de votre application.Un moyen simple de faire fonctionner le même code de manière asynchrone, sans bloquer l'interface utilisateur, est d'utiliser GCD:
Cela dit, dans les applications réelles, si vous voulez avoir la meilleure expérience utilisateur et éviter plusieurs téléchargements de la même image, vous pouvez également les avoir téléchargés, mais mis en cache. Il y a déjà pas mal de bibliothèques qui font ça de façon très transparente et elles sont toutes vraiment faciles à utiliser. Je recommande personnellement Kingfisher :
Et c'est tout
la source
image.url
par n'importe quelle URL de chaîne, codée en dur ou non :)URLSession.dataTask
car beaucoup d'autres réponses ici montrent déjà comment le faire, il est préférable de garder les différentes options ouvertes.Si vous voulez juste charger l'image (de manière asynchrone!) - ajoutez simplement cette petite extension à votre code rapide:
Et utilisez-le de cette façon:
la source
cancel
bouton, le téléchargement s'arrête. Avez-vous une idée de comment je peux le faire en utilisant cette méthode? J'ai besoin d'ajouter une fonctionnalité d'annulation.Swift 2.2 || Xcode 7.3
Il offre plusieurs fonctionnalités comme:
et très facile à mettre en œuvre pour votre application
Étape 1 Installer des modules
Alamofire 3.3.x
AlamofireImage 2.4.x
Étape 2: importation et utilisation
c'est ça!! il prendra soin de tout
Un grand merci aux gars d'Alamofire , pour avoir rendu la vie iDevelopers facile;)
la source
Xcode 8 • Swift 3
La réponse de Leo Dabus est impressionnante! Je voulais juste fournir une solution de fonction tout-en-un:
la source
J'ai encapsulé le code des meilleures réponses à la question dans une seule classe réutilisable étendant UIImageView, afin que vous puissiez utiliser directement le chargement asynchrone UIImageViews dans votre storyboard (ou les créer à partir du code).
Voici ma classe:
et voici comment l'utiliser:
la source
Swift 4 ::
Cela montrera le chargeur lors du chargement de l'image. Vous pouvez utiliser NSCache qui stocke temporairement l'image
Usage:-
la source
la source
fatal error: unexpectedly found nil while unwrapping an Optional value
Pour info: pour swift-2.0 Xcode7.0 beta2
la source
swift 3 avec gestion des erreurs
Avec extension
Utilisation de l'extension
Avec prise en charge du cache
la source
Swift 4: Un simple chargeur pour les petites images (ex: vignettes) qui utilise NSCache et s'exécute toujours sur le thread principal:
Usage:
la source
class
.Vous aurez envie de faire:
Dans Swift, ils ont remplacé la plupart des méthodes d'usine Objective C par des constructeurs réguliers.
Voir:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
la source
+(instancetype)[MyThing thingWithOtherThing:]
, vous l'appellerez aussi commeMyThing(otherThing: ...)
dans Swift.Swift 2 avec poignée d'erreur et en-tête de demande personnalisé
Ajoutez simplement l'extension à UIImageView:
Et puis, utilisez le nouveau
imageFromUrl(urlString: String)
pour télécharger l'imageUsage:
la source
Swift 4
Cette méthode téléchargera une image d'un site Web de manière asynchrone et la mettra en cache:
Utilisé:
la source
Swift 2.0:
1)
OU
2) Ajoutez cette méthode au VC ou à l'extension.
Utilisation:
la source
URL Github - https://github.com/onevcat/Kingfisher
la source
Voici le code de travail pour charger / télécharger l'image à partir de l'URL. NSCache automatiquement et afficher l'image d'espace réservé avant le téléchargement et charger l'image réelle (code Swift 4).
Utilisez comme ceci:
la source
Une méthode pour obtenir l'image qui est sûre et fonctionne avec Swift 2.0 et X-Code 7.1:
Vous appelleriez alors cette méthode comme ceci:
Si vous mettez à jour la vue avec l'image, vous devrez l'utiliser après le "si succès {":
La raison pour laquelle cette dernière partie est nécessaire si vous utilisez l'image dans l'interface utilisateur est que les appels réseau prennent du temps. Si vous essayez de mettre à jour l'interface utilisateur à l'aide de l'image sans appeler dispatch_async comme ci-dessus, l'ordinateur recherchera l'image pendant que l'image est encore en cours de recherche, trouvera qu'il n'y a pas (encore) d'image et continuera comme s'il n'y avait pas d'image a trouvé. Mettre votre code à l'intérieur d'une fermeture d'achèvement de dispatch_async dit à l'ordinateur: "Allez chercher cette image et lorsque vous avez terminé, puis complétez ce code." De cette façon, vous aurez l'image lorsque le code sera appelé et les choses fonctionneront bien.
la source
Si vous recherchez une implémentation très très simple. (Cela a fonctionné pour moi dans Swift 2)
J'ai implémenté une vue de table avec une cellule personnalisée qui n'a qu'une image
la source
Je recommande d'utiliser la bibliothèque Kingfisher pour télécharger des images de manière asynchrone. La meilleure partie de l'utilisation de Kingfisher est qu'il met en cache toutes les images téléchargées par défaut avec l'URL de l'image comme identifiant. La prochaine fois que vous demanderez de télécharger l'image avec cette URL particulière, il la chargera depuis le cache.
Usage:
la source
Vous pouvez utiliser le pod
SDWebImage
pour obtenir le même résultat. C'est facile à utiliser. Vous pouvez obtenir de la documentation ici SDWebImageVoici l exemple de code
la source
rapide 5
pour l'utilisation
la source
La seule chose qui manque est un!
la source
Réponse Swift 2.x qui télécharge l'image dans un fichier (contrairement à la réponse de Leo Dabus, qui stocke l'image en mémoire). Basé sur la réponse de Leo Dabus et la réponse de Rob de Get the data from NSURLSession DownloadTaskWithRequest du gestionnaire d'achèvement :
la source
Swift 4.1 J'ai créé une fonction, il suffit de passer l'URL de l'image, la clé de cache après la génération de l'image, la définir sur le bloc d'achèvement.
la source
J'ai créé une fonction de classe simple dans ma
Utils.swift
classe pour appeler cette méthode à laquelle vous pouvez simplement accéderclassname.methodname
et vos images sont enregistrées dans NSCache en utilisant laImageCaching.swift
classeCodding heureux. À votre santé:)
la source
Swift 4.2 et AlamofireImage
Si l'utilisation d'une bibliothèque n'est pas un problème, vous pouvez le faire à l'aide du
AlamofireImage
. mes échantillons proviennent de son GithubExemple d'images d'espace réservé:
il a de nombreuses fonctions pratiques et extension pour travailler avec des images. de la mise en cache à la mise à l'échelle et au redimensionnement ou même à l'application de filtres sur l'image. si les images sont importantes dans votre application, je vous suggère d'utiliser ce framework et de gagner du temps.
la source
L'utilisation d'Ascyimageview vous permet de charger facilement imageurl dans imageview.
laissez image1Url: URL = URL (chaîne: "(imageurl)" comme chaîne)! imageview.imageURL = image1Url
la source
Chargement d'image depuis le serveur: -
Utilisation: -
la source
Pour de meilleures performances dans
UITableView
ouUICollectionView
utilisez une bibliothèque légère Chargement intelligent paresseux Vous pouvez utiliser cette approche de chargement paresseux si vous souhaitez charger des images à partir de l'url AsynchroneSmart 'Lazy Loading' dans
UICollectionView
ou enUITableView
utilisantNSOperation
etNSOperationQueue
dans iOS Donc, dans ce projet, nous pouvons télécharger les multiples images dans n'importe quelle vue (UICollectionView
ouUITableView
) en optimisant les performances d'une application en utilisantOperation
etOperationQueue
pour la concurrence. Voici le point clé de ce projet Smart Lazy Loading: Création d'un service de téléchargement d'images. Priorisez le téléchargement en fonction de la visibilité des cellules.La classe ImageDownloadService créera une instance singleton et aura une instance NSCache pour mettre en cache les images qui ont été téléchargées. Nous avons hérité de la classe Operation de TOperation pour réduire la fonctionnalité en fonction de nos besoins. Je pense que les propriétés de la sous-classe d'opération sont assez claires en termes de fonctionnalité. Nous suivons les opérations de changement d'état en utilisant KVO.
la source