Ich möchte ein Bild von einer URL in meine Anwendung laden, also habe ich es zuerst mit Objective-C versucht und es hat funktioniert. Bei Swift habe ich jedoch einen Kompilierungsfehler:
'imageWithData' ist nicht verfügbar: Verwenden Sie die Objektkonstruktion 'UIImage (data :)'
Meine Funktion:
@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
}
In Ziel-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";
}
Kann mir bitte jemand erklären, warum das imageWithData:
mit Swift nicht funktioniert und wie ich das Problem lösen kann.
imageURL.image = UIImage(data: myDataVar)
Antworten:
Xcode 8 oder höher • Swift 3 oder höher
Synchron:
Asynchron:
Erstellen Sie eine Methode mit einem Completion-Handler, um die Bilddaten von Ihrer URL abzurufen
Erstellen Sie eine Methode zum Herunterladen des Bildes (starten Sie die Aufgabe)
Verwendungszweck:
Erweiterung :
Verwendungszweck:
quelle
UITableView
in dem eine Zelle ein Bild zeigt und das Bild aktualisiert wird, wenn die aus der Warteschlange befindliche Zelle zurückgegeben wird. Wenn Prozess Nr. 1 länger dauert als Prozess Nr. 2, zeigt Prozess Nr. 2 sein Bild an und wird später von Prozess Nr. 1 aktualisiert, obwohl dieses Bild für den Benutzer nicht mehr gültig ist.(Swift 4-Update) Um die ursprüngliche Frage direkt zu beantworten, finden Sie hier das schnelle Äquivalent des veröffentlichten Objective-C-Snippets.
HAFTUNGSAUSSCHLUSS:
Es ist wichtig zu beachten, dass die
Data(contentsOf:)
Methode den Inhalt der URL synchron in demselben Thread herunterlädt, in dem der Code ausgeführt wird. Rufen Sie dies daher nicht im Hauptthread Ihrer Anwendung auf.Eine einfache Möglichkeit, denselben Code asynchron auszuführen, ohne die Benutzeroberfläche zu blockieren, ist die Verwendung von GCD:
Wenn Sie jedoch in realen Anwendungen die beste Benutzererfahrung erzielen und mehrere Downloads desselben Bildes vermeiden möchten, möchten Sie diese möglicherweise nicht nur herunterladen, sondern auch zwischenspeichern. Es gibt bereits einige Bibliotheken, die dies sehr nahtlos tun und die alle sehr einfach zu bedienen sind. Ich persönlich empfehle Kingfisher :
Und das ist es
quelle
image.url
durch eine Zeichenfolge URL, fest codiert oder nicht :)URLSession.dataTask
da viele andere Antworten hier bereits zeigen, wie es geht. Es ist besser, die verschiedenen Optionen offen zu lassen.Wenn Sie nur ein Bild laden möchten (asynchron!), Fügen Sie einfach diese kleine Erweiterung zu Ihrem schnellen Code hinzu:
Und benutze es so:
quelle
cancel
Schaltfläche drückt, wird der Download beendet. Haben Sie eine Idee, wie ich das mit dieser Methode machen kann? Ich muss die Abbruchfunktion hinzufügen.Swift 2.2 ||Xcode 7.3
Es bietet mehrere Funktionen wie:
und sehr einfach für Ihre App zu implementieren
Schritt 1 Pods installieren
Alamofire 3.3.x.
AlamofireImage 2.4.x.
Schritt 2 importieren und verwenden
das ist es!! es wird sich um alles kümmern
Vielen Dank an Alamofire , die iDevelopers das Leben leichter gemacht haben;)
quelle
Xcode 8 • Swift 3
Die Antwort von Leo Dabus ist großartig! Ich wollte nur eine All-in-One-Funktionslösung bereitstellen:
quelle
Ich habe den Code der besten Antworten auf die Frage in eine einzige wiederverwendbare Klasse zusammengefasst, die UIImageView erweitert, sodass Sie das asynchrone Laden von UIImageViews direkt in Ihr Storyboard verwenden (oder sie aus Code erstellen) können.
Hier ist meine Klasse:
und hier ist, wie man es benutzt:
quelle
Swift 4 ::
Dies zeigt den Lader beim Laden des Bildes. Sie können NSCache verwenden, der Bilder vorübergehend speichert
Verwendungszweck:-
quelle
quelle
fatal error: unexpectedly found nil while unwrapping an Optional value
Zu Ihrer Information: Für Swift-2.0 Xcode7.0 Beta2
quelle
schnelle 3 mit Fehlerbehandlung
Mit Erweiterung
Erweiterungsnutzung
Mit Cache-Unterstützung
quelle
Swift 4: Ein einfacher Loader für kleine Bilder (z. B. Miniaturansichten), der NSCache verwendet und immer im Hauptthread ausgeführt wird:
Verwendungszweck:
quelle
class
.Du wirst machen wollen:
In Swift haben sie die meisten Objective C-Factory-Methoden durch reguläre Konstruktoren ersetzt.
Sehen:
https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26
quelle
+(instancetype)[MyThing thingWithOtherThing:]
erstellen, würden Sie sie auch wieMyThing(otherThing: ...)
in Swift aufrufen .Swift 2 mit Fehler Handle und benutzerdefiniertem Anforderungsheader
Fügen Sie einfach eine Erweiterung zu UIImageView hinzu:
Verwenden Sie dann das neue
imageFromUrl(urlString: String)
, um das Bild herunterzuladenVerwendungszweck:
quelle
Swift 4
Diese Methode lädt ein Bild asynchron von einer Website herunter und speichert es zwischen:
In Benutzung:
quelle
Swift 2.0:
1)
ODER
2) Fügen Sie diese Methode zu VC oder Extension hinzu.
Verwendungszweck :
quelle
Github-URL - https://github.com/onevcat/Kingfisher
quelle
Hier ist der Arbeitscode zum Laden / Herunterladen von Bildern von der URL. NSCache automatisch und Platzhalterbild vor dem Download anzeigen und aktuelles Bild laden (Swift 4 Code).
Verwenden Sie wie folgt:
quelle
Eine Methode, um das Bild zu erhalten, das sicher ist und mit Swift 2.0 und X-Code 7.1 funktioniert:
Sie würden diese Methode dann folgendermaßen aufrufen:
Wenn Sie die Ansicht mit dem Bild aktualisieren, müssen Sie dies nach dem "if success {" verwenden:
Der Grund, warum dieser letzte Teil benötigt wird, wenn Sie das Bild in der Benutzeroberfläche verwenden, liegt darin, dass Netzwerkanrufe einige Zeit in Anspruch nehmen. Wenn Sie versuchen, die Benutzeroberfläche mithilfe des Bildes zu aktualisieren, ohne dispatch_async wie oben aufzurufen, sucht der Computer nach dem Bild, während das Bild noch abgerufen wird, stellt fest, dass (noch) kein Bild vorhanden ist, und fährt fort, als ob kein Bild vorhanden wäre gefunden. Wenn Sie Ihren Code in einen Abschluss von dispatch_async einfügen, wird dem Computer mitgeteilt: "Gehen Sie, holen Sie sich dieses Bild, und wenn Sie fertig sind, vervollständigen Sie diesen Code." Auf diese Weise erhalten Sie das Bild, wenn der Code aufgerufen wird, und die Dinge funktionieren gut.
quelle
Wenn Sie nach einer sehr sehr einfachen Implementierung suchen. (Das hat bei mir in Swift 2 funktioniert)
Ich habe in einer Tabellenansicht eine benutzerdefinierte Zelle implementiert, die nur ein Bild enthält
quelle
Ich empfehle die Verwendung der Kingfisher-Bibliothek, um Bilder asynchron herunterzuladen. Das Beste an der Verwendung von Kingfisher ist, dass alle heruntergeladenen Bilder standardmäßig mit der Bild-URL als ID zwischengespeichert werden. Wenn Sie das nächste Mal das Herunterladen eines Bildes mit dieser bestimmten URl anfordern, wird es aus dem Cache geladen.
Verwendungszweck:
quelle
Sie können pod verwenden
SDWebImage
, um das gleiche zu erreichen. Es ist einfach zu bedienen. Hier können Sie SDWebImage dokumentierenHier ist der Beispielcode
quelle
Das einzige, was dort fehlt, ist ein!
quelle
Schnelle 2.x-Antwort, die das Bild in eine Datei herunterlädt (im Gegensatz zu Leo Dabus 'Antwort, bei der das Bild im Speicher gespeichert wird). Basierend auf der Antwort von Leo Dabus und Robs Antwort von Holen Sie sich die Daten von NSURLSession DownloadTaskWithRequest vom Completion Handler :
quelle
Swift 4.1 Ich habe eine Funktion erstellt, die nur die Bild-URL übergibt und den Cache-Schlüssel nach der Bildgenerierung auf den Abschlussblock setzt.
quelle
Ich habe in meiner
Utils.swift
Klasse eine einfache Klassenfunktion zum Aufrufen dieser Methode erstellt, auf die Sie einfach zugreifen können,classname.methodname
und Ihre Bilder werden mithilfe derImageCaching.swift
Klasse in NSCache gespeichertGlückliches Codding. Prost:)
quelle
Swift 4.2 und AlamofireImage
Wenn die Verwendung einer Bibliothek kein Problem darstellt, können Sie dies mithilfe der
AlamofireImage
. Meine Proben stammen von seinem GithubPlatzhalterbilder Beispiel:
Es hat viele praktische Funktionen und Erweiterungen, um mit Bildern zu arbeiten. vom Caching über das Skalieren und Ändern der Größe bis hin zum Anwenden von Filtern auf das Bild. Wenn Bilder in Ihrer App wichtig sind, empfehle ich, dieses Framework zu verwenden und Zeit zu sparen.
quelle
schnell 5
zum Benutzen
quelle
Mit Ascyimageview können Sie imageurl einfach in imageview laden.
lass image1Url: URL = URL (string: "(imageurl)" als String)! imageview.imageURL = image1Url
quelle
Laden von Bildern vom Server: -
Verwendungszweck :-
quelle
Für eine bessere Leistung in
UITableView
oderUICollectionView
Verwendung einer leichten Bibliothek Smart Lazy Loading Sie können diesen Lazy Loading-Ansatz verwenden, wenn Sie Bilder von der asynchronen URL laden möchtenIntelligentes 'Lazy Loading' in
UICollectionView
oderUITableView
mitNSOperation
undNSOperationQueue
unter iOS In diesem Projekt können wir also mehrere Bilder in jeder Ansicht (UICollectionView
oderUITableView
) herunterladen, indem wir die Leistung einer App mithilfe vonOperation
undOperationQueue
für die gleichzeitige Verwendung optimieren . Im Folgenden sind die wichtigsten Punkte dieses Projekts aufgeführt: Smart Lazy Loading: Erstellen eines Bilddownload-Dienstes. Priorisieren Sie das Herunterladen anhand der Sichtbarkeit der Zellen.Die ImageDownloadService-Klasse erstellt eine Singleton-Instanz und verfügt über eine NSCache- Instanz, um die heruntergeladenen Bilder zwischenzuspeichern. Wir haben die Operation-Klasse an TOperation geerbt, um die Funktionalität gemäß unseren Anforderungen zu ändern. Ich denke, die Eigenschaften der Operations-Unterklasse sind in Bezug auf die Funktionalität ziemlich klar. Wir überwachen Betriebszustandsänderungen mithilfe von KVO.
quelle