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";
} }
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
}
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))
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)
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 :)