2016-10-04 2 views
5

Ich habe meinen Code auf Swift 3 aktualisiert und habe Probleme mit der Migration zu Alamofire 4.0. Ich habe den Migrationsleitfaden von Alamofire verwendet, um die meisten erforderlichen Änderungen erfolgreich durchzuführen, habe aber immer noch Probleme beim Abrufen von Bilddaten.Holen Sie sich Bilddaten mit Alamofire Anfrage

Der alte Swift 2/Alamofire 3 Code (wie beabsichtigt funktioniert):

func beginGetImageRequest() { 
    if let imagePath = thumbPath { 
     request = Alamofire.request(.GET, imagePath).response(completionHandler: { (_, _, imageData, error) -> Void in 
      if error != nil { 
       NSLog("Error downloading thumbnail image: \(error)") 
      } else { 
       if let downloadedImage = UIImage(data: imageData!) { 
        self.imageView.image = downloadedImage 
       } 
      } 
     }) 
    } 
} 

Mein Versuch Alamofire zu Aktualisierung 4:

func beginGetImageRequest() { 
    if let imagePath = thumbPath { 
     request = Alamofire.request(imagePath, method: .get, parameters: [:], encoding: JSONEncoding.default) 
      .validate { request, response, imageData in 
       if let downloadedImage = UIImage(data: imageData!) { 
        self.imageView.image = downloadedImage 
       } else { 
        print(response) 
        print(imageData) 
       } 
       return .success 
      } 
    } 
} 

print(imageData) Ausgänge Optional(306 bytes). Das Bild sollte etwa 40 kb groß sein, was mir sagt, dass das Problem darin besteht, wie ich eine Anfrage umsetze und nicht, wie ich die Daten in ein UIImage umwandele. Hier

ist der Ausgang für print(response)

<NSHTTPURLResponse: 0x618000221660> { URL: http://209.126.98.238/cache/igames_thumb/images/games/53848027743af.jpeg } { status code: 400, headers { 
    Connection = close; 
    "Content-Encoding" = gzip; 
    "Content-Length" = 245; 
    2016-10-04 21:54:53.653480 EyeGames[74216:3416747] [] nw_connection_send_stats_report 21 Generated report: 
    Delegated:         0 
    Report reason:        app data stall 
    TCP statistics report:      
    Time to DNS start:      0 ms 
    Time to DNS resolved:     0 ms 
    DNS resolved time:      0 ms 
    DNS answers cached:      0 
    Interface type:       1 
    Time to TCP start:      3 ms 
    Time to TCP establishment:    223 ms 
    Connection establishment:    220 ms 
    Flow duration:       11447 ms 
    Connected interface type:    1 
    Connected:        1 
    Traffic class:       0 
    Cellular fallback:      0 
    Cellular RRC connected:     0 
    Kernel reported stalls:     0 
    Kernel reported connection stalls:  0 
    Kernel reported read stalls:    0 
    Kernel reported write stalls: 
"Content-Type" = "text/html; charset=iso-8859-1"; 
    Date = "Tue, 04 Oct 2016 18:54:43 GMT"; 
    Server = "Apache/2.2.22 (Debian)"; 
    Vary = "Accept-Encoding"; 
} } 
+0

Aufruf Und was die Antwort enthält? Sie sollten dort anfangen – Godfather

+0

@Godfather Redigiert meine Frage, um die Ausgabe von der Antwort –

+0

aufzunehmen Sie erhalten 400 Fehlercode. Ihre Anfrage ist fehlerhaft. Versuchen Sie, die Codierung in URL zu ändern – Godfather

Antwort

14

Die Leute bei Alamofire über hat diese Bildkomponentenbibliothek, AlamofireImage. Es behandelt all diese Dinge für Sie, um Ihnen das Leben zu erleichtern. Fügen Sie es zu Ihrem Projekt hinzu und dann können Sie einfach folgendes tun:

import Alamofire 
import AlamofireImage 

Alamofire.request(imageUrl, method: .get).responseImage { response in 
    guard let image = response.result.value else { 
     // Handle error 
     return 
    } 
    // Do stuff with your image 
} 
+0

Das ist perfekt! Wusste nicht über diese Komponentenbibliothek. Vielen Dank! –

+1

Muss ich Alamofire und AlamofireImage in meinem Projekt hinzufügen, um AlamofireImage zu verwenden oder einfach nur AlamofireImage hinzuzufügen, würde das funktionieren, um den obigen Code auszuführen. –

2

Wenn Sie wirklich wollen Alamofire verwenden, um ein Bild herunterzuladen, sollten Sie versuchen, statt JSONEncoding urlencoding, wie Pate oben in den Kommentaren vorgeschlagen. Obwohl ich stattdessen Kingfisher empfehlen würde. Es wird Sie eine einzige Zeile Code statt einer GET-Request-Methode mit Alamofire:

self.imageView.kf.setImage(with: URL(string: imagePath)) 
+0

Da mein Projekt bereits sehr abhängig von Alamofire für Bild und Nicht-Bild-Probleme ist, bleibe ich lieber bei Alamofire. Aber ich werde Kingfisher für zukünftige Projekte im Auge behalten. Danke für deinen Beitrag! –

0

Sie können Bild-Cache-Problem haben, wo Sie zuvor gespeichertes Bild erhalten.

Um dies zu verhindern, können Sie Cache für die URL zu entfernen, bevor Alamofire.request

let urlRequest = URLRequest(url: URL(string: url)!) 
URLCache.shared.removeCachedResponse(for: urlRequest)