Получить данные изображения с запросом Alamofire

Я обновил свой код до Swift 3, и у меня возникли проблемы с переходом на Alamofire 4.0. Я использовал руководство по миграции Alamofire, чтобы успешно внести большинство необходимых изменений, но у меня все еще возникают проблемы с получением данных изображения.

Старый код Swift 2/Alamofire 3 (работал по назначению):

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

Моя попытка обновления до 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) выводит Optional(306 bytes). Изображение должно быть около 40 КБ, что говорит мне о том, что проблема связана с тем, как я реализую запрос, а не с тем, как я преобразовываю данные в UIImage.

Вот результат для 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";
} }

person Austin Wood    schedule 04.10.2016    source источник
comment
И что содержит ответ? ты должен начать там   -  person Godfather    schedule 04.10.2016
comment
@Godfather Отредактировал мой вопрос, включив вывод из ответа   -  person Austin Wood    schedule 04.10.2016
comment
Вы получаете код ошибки 400. Ваш запрос имеет неверный формат. Попробуйте изменить кодировку на URL   -  person Godfather    schedule 04.10.2016


Ответы (4)


Ребята из Alamofire создали библиотеку компонентов изображений, AlamofireImage. Он обрабатывает все эти вещи для вас, чтобы сделать вашу жизнь проще. Добавьте его в свой проект, а затем вы можете просто сделать это:

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
}
person DerFlickschter    schedule 04.10.2016
comment
Это потрясающе! Не знал об этой библиотеке компонентов. Благодарю вас! - person Austin Wood; 05.10.2016
comment
Нужно ли мне добавлять Alamofire и AlamofireImage в мой проект, чтобы использовать AlamofireImage, или просто добавление одного только AlamofireImage будет работать для запуска вышеуказанного кода. - person Jay Mehta; 03.05.2017

Если вы действительно хотите использовать Alamofire для загрузки изображения, вам следует попробовать URLEncoding вместо JSONEncoding, как предложил Крестный отец в комментариях выше. Хотя я бы рекомендовал вместо этого использовать Kingfisher. Это займет у вас одну строку кода вместо метода запроса GET с Alamofire:

self.imageView.kf.setImage(with: URL(string: imagePath))
person alexburtnik    schedule 04.10.2016
comment
Так как мой проект уже очень зависит от Alamofire как для изображений, так и для других вопросов, я предпочитаю придерживаться Alamofire. Но я буду иметь в виду Kingfisher для будущих проектов. Спасибо за ваш вклад! - person Austin Wood; 05.10.2016

У вас может возникнуть проблема с кэшем изображений, когда вы получаете предыдущее сохраненное изображение.

Чтобы предотвратить это, вы можете удалить кеш для URL-адреса перед вызовом Alamofire.request

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

Вы можете напрямую загрузить изображение с данного URL.

import AlamofireImage

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

imageView.af_setImage(withURL: URL!)

Надеюсь, это сработает :)

person Raghib Arshi    schedule 13.12.2018