Swift在UITableView中异步加载图像 - 顶部单元格没有图片
问题描述:
现在我正在使用Google Places API在用户附近下载径向地点列表。当我得到JSON响应时,我解析它并创建一个用于填充表视图的位置数组。以前,我同步加载图像,使得tableview的加载时间过长。我已经添加了异步加载,但是,加载表视图时出现问题,但在图像下载完成后最初显示的单元格不会刷新,只有当我滚动传递它们然后备份时才会刷新图像显示(前几个可见的所有地方都已加载图片)。如果有一种方法可以在我的场景对象的异步调用中刷新tableView,那可能会有所帮助,但我不确定是否重新加载多次是最佳实践的tableView或者是否有更干净的方式。Swift在UITableView中异步加载图像 - 顶部单元格没有图片
我对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)
}
}
}
}
答
我以SDWebImage(https://github.com/rs/SDWebImage)解决了我的问题,而不是试图异步下载图片自己。这是非常简单和非常快,它也提供了一个很好的进度指示器,而图像加载