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