521 Stimmen

Laden/Herunterladen von Bildern von URL auf Swift

Ich möchte ein Bild aus einer URL in meiner Anwendung laden, also habe ich es zuerst mit Objective-C versucht und es hat funktioniert, aber mit Swift habe ich 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://meineURL/ios8.png")
    var data:NSData = NSData.dataWithContentsOfURL(url, options: nil, error: nil)

    imageView.image = UIImage.imageWithData(data)// Fehler hier
}

In Objective-C:

- (void)viewDidLoad {
    [super viewDidLoad];

    NSURL *url = [NSURL URLWithString:(@"http://meineURL/ios8.png")];
    NSData *data = [NSData dataWithContentsOfURL:url];

    _imageView.image = [UIImage imageWithData: data];
    _labelURL.text = @"http://www.urltest.fr/assets/img/iOS%20icon's%20Style/ios8.png";
 }

Kann mir bitte jemand erklären, warum imageWithData: nicht mit Swift funktioniert und wie ich das Problem lösen kann.

12voto

fethica Punkte 689

Swift 4: Ein einfacher Loader für kleine Bilder (z. B. Thumbnails), der NSCache verwendet und immer im Hauptthread läuft:

class ImageLoader {

  private static let cache = NSCache()

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

}

Verwendung:

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

11voto

Amro Jaber Punkte 185

Swift 5

extension UIImageView {
    func load(url: URL) {
        DispatchQueue.global().async { [weak self] in
            if let data = try? Data(contentsOf: url) {
                if let image = UIImage(data: data) {
                    DispatchQueue.main.async {
                        self?.image = image
                    }
                }
            }
        }
    }
}

für die Verwendung

override func awakeFromNib() {
    super.awakeFromNib()
   if let url = URL(string:""){
     imgView.load(url: url)
   }
}

8voto

joshstaiger Punkte 1239

Sie werden tun wollen:

UIImage(data: Daten)

In Swift haben sie die meisten Objective-C-Fabrikmethode durch normale Konstruktoren ersetzt.

Siehe:

https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/InteractingWithObjective-CAPIs.html#//apple_ref/doc/uid/TP40014216-CH4-XID_26

7voto

Cody Punkte 4124

Swift 2 mit Fehlerbehandlung und benutzerdefiniertem Anforderungsheader

Fügen Sie einfach die Erweiterung zu UIImageView hinzu:

extension UIImageView {
    public func imageFromUrl(urlString: String) {
        if let url = NSURL(string: urlString) {
            let request = NSMutableURLRequest(URL: url)
            request.setValue("", forHTTPHeaderField: "")
            NSURLSession.sharedSession().dataTaskWithRequest(request) {
                (data, response, error) in
                guard let data = data where error == nil else{
                    NSLog("Fehler beim Herunterladen des Bildes: \(error)")
                    return
                }

                if let httpResponse = response as? NSHTTPURLResponse{
                    if httpResponse.statusCode > 400 {
                        let errorMsg = NSString(data: data, encoding: NSUTF8StringEncoding)
                        NSLog("Fehler beim Herunterladen des Bildes, statusCode: \(httpResponse.statusCode), Fehler: \(errorMsg!)")
                        return
                    }
                }

            dispatch_async(dispatch_get_main_queue(), {
                NSLog("Bild erfolgreich heruntergeladen")
                self.image = UIImage(data: data)
            })
            }.resume()
        }
    }
}

Und dann verwenden Sie das neue imageFromUrl(urlString: String), um das Bild herunterzuladen

Verwendung:

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

7voto

Bobby Punkte 5884

Swift 4

Diese Methode lädt ein Bild von einer Website asynchron herunter und speichert es im Cache:

    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("Fehler: \(String(describing: error))")
                return closure(nil)
            }
            guard response != nil else {
                print("keine Antwort")
                return closure(nil)
            }
            guard data != nil else {
                print("keine Daten")
                return closure(nil)
            }
            DispatchQueue.main.async {
                closure(UIImage(data: data!))
            }
        }; task.resume()
    }

In Benutzung:

    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)
        } // Wenn Sie eine Else-Anweisung verwenden, wird sie im Hintergrund ausgeführt
    }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X