快速加载UITableView中的图像异步 - 顶部单元格没有图片

时间:2017-06-15 18:43:59

标签: swift uitableview asynchronous swift3 uiimageview

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

我对iOS开发相对较新,所以如果有人对我这样做有不同的处理方式,我很乐意听到。

将地方变成数组格式:

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 个答案:

答案 0 :(得分:0)

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