我正在尝试在FriendsTableView(UITableView)单元格中异步加载图片.图像加载正常,但是当我滚动表格时,图像会改变几次,错误的图像会被分配给错误的单元格.
我已经尝试了我在StackOverflow中可以找到的所有方法,包括向raw添加标签然后检查它但是没有用.我还要验证应该使用indexPath更新的单元格并检查单元格是否存在.所以我不知道为什么会这样.
这是我的代码:
func tableView(tableView: UITableView,cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("friendCell",forIndexPath: indexPath) as! FriendTableViewCell var avatar_url: NSURL let friend = sortedFriends[indexPath.row] //Style the cell image to be round cell.friendAvatar.layer.cornerRadius = 36 cell.friendAvatar.layer.masksToBounds = true //Load friend photo asyncronisly avatar_url = NSURL(string: String(friend["friend_photo_url"]))! if avatar_url != "" { getDataFromUrl(avatar_url) { (data,response,error) in dispatch_async(dispatch_get_main_queue()) { () -> Void in guard let data = data where error == nil else { return } let thisCell = tableView.cellForRowAtIndexPath(indexPath) if (thisCell) != nil { let updateCell = thisCell as! FriendTableViewCell updateCell.friendAvatar.image = UIImage(data: data) } } } } cell.friendNameLabel.text = friend["friend_name"].string cell.friendHealthPoints.text = String(friend["friend_health_points"]) return cell }
解决方法
这是因为UITableView重用了单元格.以这种方式加载它们会导致异步请求在不同时间返回并弄乱订单.
我建议你使用一些图书馆,让你的生活更轻松如翠鸟.它将为您下载和缓存图像.您也不必担心异步调用.
https://github.com/onevcat/Kingfisher
你的代码看起来像这样:
func tableView(tableView: UITableView,forIndexPath: indexPath) as! FriendTableViewCell var avatar_url: NSURL let friend = sortedFriends[indexPath.row] //Style the cell image to be round cell.friendAvatar.layer.cornerRadius = 36 cell.friendAvatar.layer.masksToBounds = true //Load friend photo asyncronisly avatar_url = NSURL(string: String(friend["friend_photo_url"]))! if avatar_url != "" { cell.friendAvatar.kf_setImageWithURL(avatar_url) } cell.friendNameLabel.text = friend["friend_name"].string cell.friendHealthPoints.text = String(friend["friend_health_points"]) return cell }