我使用Alamofire从服务器获取数据,然后将它们放入CarType
个CarType
对象数组中,name
是我的结构。我从服务器获得的是id
,iconUrl
和icon
。来自iconUrls我想下载图标并将它们放在icon
中。之后,我会在集合视图中使用name
和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()))
}
。我的Alamofire请求是:
import Foundation
import UIKit
struct CarType {
var name : String
var id : Int
var iconUrl : String
var icon : UIImage
}
我的结构是:
display: flex
我想在collectionView中使用它们之前下载图像。 我如何下载图像(使用AlamofireImage)并将它们放在相关的carType图标属性中?
答案 0 :(得分:2)
你问的是移动应用中真的很糟糕的做法。例如,一个案例,你提出了一个请求并且在一个数组中得到了20个项目,并且为了将所有UIImage
放入你的模型中,你必须再发出20个请求,你甚至不需要知道你的用户最终是否会使用(查看)这些图标或不是。
相反,您可以在显示单元格(我猜,您将在单元格中显示这些图标)时显示图像,为此您可以使用SDWebImage等库(objective c
)或者Kingfisher(swift),其中包含UIImageView
的扩展名,可以轻松获取和显示图像。这些库也可以缓存下载的图像。
另外,对象映射的另一个建议。目前,您手动将json
映射到模型。有很多好的库可以为你处理,可以自动化你的对象映射过程,例如 - ObjectMapper
希望,这很有帮助。祝你好运!
答案 1 :(得分:1)
我在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]()
您可以在方法中使用上述代码,它应该可以正常工作。