在我的应用中,我有tableview
部分。问题出在图片上。当用户滚动列表时,显示的图像不正确。我知道问题是因为回收,但我仍然找不到任何解决方案。
代码
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let myeventCell = self.tableView.dequeueReusableCellWithIdentifier("MyEventsTableViewCell", forIndexPath: indexPath) as! MyEventsTableViewCell
myeventCell.wedImage.clipsToBounds=true;
myeventCell.tag=indexPath.row+indexPath.section;
//to download image
if wedImgDownload[indexPath.section][indexPath.row] == false
{
// myeventCell.wedImage.image = UIImage(data: self.webImgData[indexPath.section][indexPath.row]);
if let url = NSURL(string: wedImageUrl[indexPath.section][indexPath.row] as String) {
let request = NSURLRequest(URL: url)
NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) {
(response: NSURLResponse?, data: NSData?, error: NSError?) -> Void in
if let imageData = data as NSData? {
if myeventCell.tag == indexPath.row+indexPath.section {
self.wedImgDownload[indexPath.section].removeAtIndex(indexPath.row)
self.wedImgDownload[indexPath.section].insert(true, atIndex: indexPath.row)
self.webImgData[indexPath.section].insert(data!, atIndex: indexPath.row)
myeventCell.wedImage.image = UIImage(data: imageData);
}
}
}
}
}
else{
if self.webImgData[indexPath.section][indexPath.row] != ""{
if myeventCell.tag == indexPath.row+indexPath.section {
myeventCell.wedImage.image = UIImage(data: self.webImgData[indexPath.section][indexPath.row])
}
}
}
return myeventCell;
}
请知道如何解决这个问题?
答案 0 :(得分:0)
这是因为细胞正在重复使用。每次重复使用时,单元格都会启动请求。由于它们是异步的,因此无法确定请求完成的顺序。请求完成并设置图像后,单元格将被重用,并在当前请求正在进行时显示上一个图像。
不推荐使用 NSURLConnection
,您应该使用NSURLSession
。您需要缓存这些图像,而不是每次显示时都启动请求。每次重复使用单元格时,您还需要清除图像,以便在显示时不显示上一个图像。
有许多开源库可以完成这些工作,并且经过了数百万用户的极好测试和使用。除非对项目的要求很高,否则不利用它们是愚蠢的。
https://github.com/pinterest/PINRemoteImage