2016-10-04 2 views
5

Я обновил свой код до Swift 3 и у меня возникли проблемы с переходом на Alamofire 4.0. Я использовал руководство по миграции Alamofire для успешного внесения большинства необходимых изменений, но у меня все еще возникают проблемы с получением данных изображения.Получить данные изображения с запросом 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"; 
} } 
+0

И что ответ содержит? вы должны начать там – Godfather

+0

@Godfather Отредактировал мой вопрос, чтобы включить вывод ответа –

+0

. Вы получаете код ошибки 400. Ваш запрос неверен. Попробуйте изменить кодировку на URL – Godfather

ответ

14

Люди в 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 
} 
+0

Это прекрасно! Не знал об этой библиотеке компонентов. Спасибо! –

+1

Должен ли я добавить Alamofire и AlamofireImage в свой проект, чтобы использовать AlamofireImage или просто добавить AlamofireImage, чтобы работать над этим кодом. –

2

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

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

Поскольку мой проект уже очень сильно зависит от Alamofire для проблем с изображением и без изображения, я предпочитаю придерживаться Alamofire. Но я буду держать Kingfisher в виду для будущих проектов. Спасибо за ваш вклад! –

0

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

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

let urlRequest = URLRequest(url: URL(string: url)!) 
URLCache.shared.removeCachedResponse(for: urlRequest) 
Смежные вопросы