web-dev-qa-db-fra.com

Obtenir des données d'image avec la demande d'Alamofire

J'ai mis à jour mon code vers Swift 3 et j'ai des problèmes avec la migration vers Alamofire 4.0. J'ai utilisé le guide de migration d'Alamofire pour effectuer la plupart des modifications nécessaires, mais j'ai toujours du mal à obtenir les données d'image.

L'ancien Swift 2/Alamofire 3 code (fonctionne comme prévu):

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

Ma tentative de mise à jour vers Alamofire 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) renvoie Optional(306 bytes). L’image doit faire environ 40 kb, ce qui me dit que le problème est lié à la manière dont je mets en œuvre la requête, et non à la conversion des données en UIImage.

Voici la sortie pour 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";
} }
10
Austin Wood

Les gens d’Alamofire ont créé une bibliothèque de composants d’image, AlamofireImage . Il gère tout cela pour vous faciliter la vie. Ajoutez-le à votre projet et vous pourrez alors faire ceci:

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
}
22
DerFlickschter

Si vous voulez vraiment utiliser Alamofire pour télécharger une image, vous devriez essayer URLEncoding au lieu de JSONEncoding, comme l’a suggéré Parrain dans les commentaires précédents. Bien que je recommande d'utiliser plutôt Kingfisher. Cela vous prendra une seule ligne de code au lieu d'une méthode de requête GET avec Alamofire:

self.imageView.kf.setImage(with: URL(string: imagePath))
2
alexburtnik

Vous pouvez avoir un problème de cache d'image où vous obtenez une image enregistrée précédente.

Pour éviter cela, vous pouvez supprimer le cache de l'URL avant d'appeler Alamofire.request

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

Vous pouvez directement télécharger une image depuis une URL donnée.

import AlamofireImage

let URL = URL(string: "your image url")

imageView.af_setImage(withURL: URL!)

J'espère que ça va marcher :)

0
Raghib Arshi