Swift 在 UITableView 中异步加载图像 - 顶部单元格没有图片

Posted

技术标签:

【中文标题】Swift 在 UITableView 中异步加载图像 - 顶部单元格没有图片【英文标题】:Swift Loading Images in a UITableView Asynchronously - top cells have no picture 【发布时间】:2017-06-15 18:43:58 【问题描述】:

现在我正在使用 Google Places API 下载用户附近的位置列表。当我得到 JSON 响应时,我会解析它并创建一个用于填充表格视图的位置数组。以前,我同步加载了图像,这使得 tableview 的加载时间太长了。我已经添加了一个异步加载,但是,问题出现在表格视图加载的地方,但最初显示的单元格在图像下载完成后不会刷新,只有当我滚动通过它们然后备份时,确实图像显示(前几个可见下方的所有位置都已加载图片)。如果有办法在我的位置对象的异步调用中刷新 tableView,那可能会有所帮助,但我不确定多次重新加载 tableView 是否是好的做法,或者是否有更干净的方法。

我对 ios 开发还比较陌生,所以如果有人对我的开发方式有不同的看法,我很想听听。

将 Places 转换为数组格式:

let task = URLSession.shared.dataTask(with: url!) (data, response, error) in
do
    print("\n Starting JSON Parsing \n")
    if let json = try JSONSerialization.jsonObject(with: data!) as? AnyObject
        if let results = json["results"] as? NSArray
            print("\(results.count)")
            for case let result as NSDictionary in results
                let item = result
                let name = item["name"]

                if let name = name,
                    let id = item["id"],
                    let photos = item["photos"] as? NSArray,
                    let photo = photos.firstObject as? NSDictionary,
                    let photoRef = photo["photo_reference"] 
                    let place = Place(name: "\(name)", desc: "\(id)", imageRef: "\(photoRef)")
                    self.placeList.append(place)
                
                else 
                    print("\n\n \(name) \n\n")
                
            
            self.placeList.sort(by: $0.name > $1.name)

            DispatchQueue.main.async 
                self.tableView.reloadData()
            
        
    

catch 
    print("Error deserializing JSON: \(error)")

放置对象初始化器:

    init(name: String, desc: String, imageRef: String) 
        self._desc = desc
        self._imageURL = imageURL
        self._name = name

        if let url = NSURL(string: "https://maps.googleapis.com/maps/api/place/photo?maxwidth=150&photoreference=\(imageRef)&key=MyKey") 
            DispatchQueue.global().async 
                if let data = NSData(contentsOf: url as URL) 
                    DispatchQueue.main.async 
                        self.image = UIImage(data: data as Data)
                    
                
            
        

【问题讨论】:

【参考方案1】:

我通过使用 SDWebImage (https://github.com/rs/SDWebImage) 解决了我的问题,而不是尝试自己异步下载图像。它非常简单且非常快速,并且在加载图像时提供了一个很好的进度指示器

【讨论】:

以上是关于Swift 在 UITableView 中异步加载图像 - 顶部单元格没有图片的主要内容,如果未能解决你的问题,请参考以下文章

使用 Autolayout 在 UITableView 中异步加载图像

uitableview 中的异步图像加载

在加载 App 之前 Swift 填充 UITableView

在 Swift 中将 JSON 加载到 UItableView

在 UITableView 中的 iPhone 上异步加载 JSON

等待 Parse Async 函数在 Swift 中完成