Как я могу преобразовать AFDataResponse в данные, чтобы отобразить изображение с использованием байтов?

#ios #networking #alamofire #urlsession

#iOS #сеть #alamofire #urlsession

Вопрос:

Я создал служебный файл, чтобы обрабатывать все мои сетевые настройки в приложении погоды, которое я настраиваю. В этом служебном файле я использую протоколы, чтобы возвращать полученные данные из запросов GET соответствующему контроллеру представления.

Во время моего рефакторинга кода и ради обучения, а не использования URLSessions, я решил, что хочу научиться использовать Alamofire.

Один из моих запросов GET извлекает изображение либо (солнце, облако, дождевое облако и т. Д.), В зависимости от погоды определенного города (это пример URL-адреса, на который я отправляю запрос GET: http://openweathermap.org/img/wn/03n@2x.png .

Прежде чем я импортировал Alomofire, я бы ПОЛУЧИЛ байты этого изображения и отобразил байты в UIImage следующим образом:

 self.weatherIcon.image = UIImage(data: result)
 

Это сработало просто отлично. Но теперь, при использовании Alamofire для моего запроса, проблема, с которой я сталкиваюсь, заключается в том, что я не могу преобразовать AFDataResponse в данные типа, чтобы затем отобразить в UIImage.

Ниже вы можете увидеть мой запрос GET.

 AF.request(myUrl).responseData{response in
   debugPrint(reponse)
   self.delegate3?.iconServiceDelegateDidFinishWithData(result: response)
}
 

Ответ имеет тип AFDataResponse .

Поэтому при попытке записи:

 self.weatherIcon.image = UIImage(data: result) 
 

Я получаю сообщение об ошибке,

Не удается преобразовать значение типа ‘AFDataResponse (он же ‘DataResponse<Данные, ошибка’) в ожидаемый тип аргумента ‘Данные’.

Любая помощь будет высоко оценена сообществом.

Спасибо.

Ответ №1:

Простой ответ:

Создайте переменную типа Data и назначьте response .данные в эту переменную.

 AF.request(myUrl).responseData{ response in
   debugPrint(response)
   var imgData : Data                    //create variable of type data
   imgData = Data(response.data!)       // access the data through response.data
   self.delegate3?.iconServiceDelegateDidFinishWithData(result: imgData)
}
 

Ответ №2:

Есть много способов сделать это. Вы можете получить доступ data напрямую, как вы изначально предлагали (хотя я бы рассматривал это как Optional , а не принудительное разворачивание, так как в противном случае это приведет к сбою).

 .responseData { response in
    let image = response.data.map(UIImage.init(data:)) // Creates UIImage?
}
 

Вы можете преобразовать Result значение, чтобы сохранить любое Error полученное вами значение.

 .responseData { response in
    let image = response.result.map(UIImage.init(data:)) // Creates Result<UIImage, AFError>
}
 

Или вы можете отобразить все DataResponse .

 .responseData { response in
    let imageResponse = response.map(UIImage.init(data:)) // Creates DataResponse<UIImage, AFError>
}