-1

我正在使用 Alamofire 从服务器获取数据,然后将它们放入一个CarType对象数组中,这CarType是我的结构。我从服务器得到的是name,idiconUrl. 从 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 图标属性中?

4

2 回答 2

2

您要问的是移动应用程序中的不良做法。举个例子,你提出一个请求,得到了一个数组中的 20 个项目,为了将所有UIImage的 s 放入你的模型中,你必须再提出 20 个请求,你甚至不知道你的用户是否会最终使用(查看)这些图标或不使用。

相反,您可以在显示单元格(我猜,您将在单元格中显示这些图标)时获取图像,为此您可以使用SDWebImage ( objective c) 或KingfisherUIImageView (swift) 之类的库,它们具有扩展名易于获取和显示图像。这些库还可以缓存下载的图像。

此外,另一个关于对象映射的建议。目前,您正在json手动映射到您的模型。有很多很好的库可以为您处理这些问题,它们可以自动化您的对象映射过程,例如 - ObjectMapper

希望,这很有帮助。祝你好运!

于 2017-01-15T16:44:43.497 回答
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]()

您可以在您的方法中使用上面的代码,它应该可以正常工作。

于 2017-01-15T16:52:51.977 回答