使用 alamofire 下载图像 - iOS
download images using alamofire - iOS
我正在使用 Alamofire 从服务器获取数据,然后将它们放入 CarType
个对象的数组中,CarType
是我的结构。我从服务器得到的是 name
、 id
和 iconUrl
。从 iconUrls 我想下载图标并将它们放在 icon
中。之后,我将在集合视图中使用 icon
和 name
。我的 Alamofire 请求是:
var info = [CarType]()
Alamofire.request(.GET,"url")
.responseJSON { response in
for (_,subJson):(String, JSON) in json["result"]
{
let name = subJson["name"].string
let iconUrl = subJson["icon"].string
let id = subJson["id"].int
info.append(CarType(id: id!, name: name!, iconUrl: iconUrl! , image: UIImage()))
}
我的结构是:
import Foundation
import UIKit
struct CarType {
var name : String
var id : Int
var iconUrl : String
var icon : UIImage
}
我想在 collectionView 中使用之前下载图像。
我如何下载图像(使用 AlamofireImage)并将它们放在相关的 carType 图标中 属性?
你问的是移动应用程序中的不良做法。举个例子,例如,你发出一个请求并在一个数组中得到大约 20 个项目,为了将所有 UIImage
放入你的模型中,你必须再发出 20 个请求,而且你甚至不需要知道您的用户最终是否会使用(查看)这些图标。
相反,您可以在显示单元格(我猜,您将在单元格中显示这些图标)时获取图像,为此您可以使用像 SDWebImage(objective c
) or Kingfisher(swift) 具有 UIImageView
的扩展名,使获取和显示图像变得简单。这些库还可以缓存下载的图像。
另外,关于对象映射的另一个建议。目前,您正在手动将 json
映射到您的模型。有很多好的库可以为您处理这些问题,它们可以使您的对象映射过程自动化,例如 - ObjectMapper
希望这对您有所帮助。祝你好运!
我在 UITableview 中完成了功能性的事情,在 CellForRowIndex 方法中添加了以下内容:
getDataFromUrl(urlString){(data,response,error) -> Void in
if error == nil {
// Convert the downloaded data in to a UIImage object
let image = UIImage(data: data!)
// Store the image in to our cache
if((image) != nil){
// Store the image in to our cache
self.imageCacheProfile[urlString] = image
// Update the cell
DispatchQueue.main.async(execute: {
cell.imgvwProfile?.image = image
})
}
else{
cell.imgvwProfile!.image = UIImage(named: "user")
}
}
}
func getDataFromUrl(_ strUrl:String, completion: @escaping ((_ data: Data?, _ response: URLResponse?, _ error: NSError? ) -> Void)) {
let url:URL = URL(string: strUrl)!
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) {data, response, err in
print("Entered the completionHandler")
}.resume()
}
您还需要声明imageCache 来存储下载的图片。
var imageCache = [String:UIImage]()
您可以在您的方法中使用上面的代码,它应该可以正常工作。
我正在使用 Alamofire 从服务器获取数据,然后将它们放入 CarType
个对象的数组中,CarType
是我的结构。我从服务器得到的是 name
、 id
和 iconUrl
。从 iconUrls 我想下载图标并将它们放在 icon
中。之后,我将在集合视图中使用 icon
和 name
。我的 Alamofire 请求是:
var info = [CarType]()
Alamofire.request(.GET,"url")
.responseJSON { response in
for (_,subJson):(String, JSON) in json["result"]
{
let name = subJson["name"].string
let iconUrl = subJson["icon"].string
let id = subJson["id"].int
info.append(CarType(id: id!, name: name!, iconUrl: iconUrl! , image: UIImage()))
}
我的结构是:
import Foundation
import UIKit
struct CarType {
var name : String
var id : Int
var iconUrl : String
var icon : UIImage
}
我想在 collectionView 中使用之前下载图像。 我如何下载图像(使用 AlamofireImage)并将它们放在相关的 carType 图标中 属性?
你问的是移动应用程序中的不良做法。举个例子,例如,你发出一个请求并在一个数组中得到大约 20 个项目,为了将所有 UIImage
放入你的模型中,你必须再发出 20 个请求,而且你甚至不需要知道您的用户最终是否会使用(查看)这些图标。
相反,您可以在显示单元格(我猜,您将在单元格中显示这些图标)时获取图像,为此您可以使用像 SDWebImage(objective c
) or Kingfisher(swift) 具有 UIImageView
的扩展名,使获取和显示图像变得简单。这些库还可以缓存下载的图像。
另外,关于对象映射的另一个建议。目前,您正在手动将 json
映射到您的模型。有很多好的库可以为您处理这些问题,它们可以使您的对象映射过程自动化,例如 - ObjectMapper
希望这对您有所帮助。祝你好运!
我在 UITableview 中完成了功能性的事情,在 CellForRowIndex 方法中添加了以下内容:
getDataFromUrl(urlString){(data,response,error) -> Void in
if error == nil {
// Convert the downloaded data in to a UIImage object
let image = UIImage(data: data!)
// Store the image in to our cache
if((image) != nil){
// Store the image in to our cache
self.imageCacheProfile[urlString] = image
// Update the cell
DispatchQueue.main.async(execute: {
cell.imgvwProfile?.image = image
})
}
else{
cell.imgvwProfile!.image = UIImage(named: "user")
}
}
}
func getDataFromUrl(_ strUrl:String, completion: @escaping ((_ data: Data?, _ response: URLResponse?, _ error: NSError? ) -> Void)) {
let url:URL = URL(string: strUrl)!
let request = URLRequest(url: url)
URLSession.shared.dataTask(with: request) {data, response, err in
print("Entered the completionHandler")
}.resume()
}
您还需要声明imageCache 来存储下载的图片。
var imageCache = [String:UIImage]()
您可以在您的方法中使用上面的代码,它应该可以正常工作。