iosswiftalamofirealamofireimage

Get image data with Alamofire request


I've updated my code to Swift 3 and am having trouble with the migration to Alamofire 4.0. I've used the Alamofire migration guide to successfully make most of the necessary modifications, but am still having trouble getting image data.

The old Swift 2 / Alamofire 3 code (worked as intended):

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

My attempt at updating to 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) outputs Optional(306 bytes). The image should be about 40 kb, which tells me the problem is with how I am implementing request, not with how I am converting the data to a UIImage.

Here is the output for 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";
} }

Solution

  • The folks over at Alamofire made an image component library, AlamofireImage. It handles all this stuff for you to make your life easier. Add it to your project and then you can just do this:

    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
    }