Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 从UITableView单元格内的url异步加载图像-滚动时加载错误的图像_Ios_Swift_Uitableview_Asynchronous_Uiimage - Fatal编程技术网

Ios 从UITableView单元格内的url异步加载图像-滚动时加载错误的图像

Ios 从UITableView单元格内的url异步加载图像-滚动时加载错误的图像,ios,swift,uitableview,asynchronous,uiimage,Ios,Swift,Uitableview,Asynchronous,Uiimage,我有一个在单元格中显示图像的tableView。大多数情况下会显示正确的图像,但偶尔会显示错误的图像(通常是在快速向下滚动tableView时)。我异步下载图像 cell.profImg.getImgFromUrl(link: man.img, contentMode: cell.profImg.contentMode) 这里我做异步请求: extension UIImageView { func getImgFromUrl(link link:String, contentMode mode

我有一个在单元格中显示图像的tableView。大多数情况下会显示正确的图像,但偶尔会显示错误的图像(通常是在快速向下滚动tableView时)。我异步下载图像

cell.profImg.getImgFromUrl(link: man.img, contentMode: cell.profImg.contentMode)
这里我做异步请求:

extension UIImageView {
func getImgFromUrl(link link:String, contentMode mode: UIViewContentMode) {
    guard
        let url = NSURL(string: link)
        else {return}
    contentMode = mode
    NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
        guard
            let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
            let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
            let data = data where error == nil,
            let image = UIImage(data: data)
            else { return }
        dispatch_async(dispatch_get_main_queue()) { () -> Void in
            self.image = image
        }
    }).resume()
    }
}

我认为这是因为当您开始加载HTTP映像时,没有重置
UIImageView
的内容。因此,当重新使用单元格时,将显示先前加载的图像

您只需通过类似于
self.image=nil
(如果需要空白图像)或
self.image=myPlaceholderImage
(如果在加载期间需要占位符图像)的方式启动
getImgFromUrl
。以下是如何将其集成到代码中:

extension UIImageView {
    func getImgFromUrl(link link: String, contentMode mode: UIViewContentMode) {
        guard
        self.image = nil // Here you can put nil to have a blank image or a placeholder image
        let url = NSURL(string: link)
        else { return }
        contentMode = mode
        NSURLSession.sharedSession().dataTaskWithURL(url, completionHandler: { (data, response, error) -> Void in
            guard
            let httpURLResponse = response as? NSHTTPURLResponse where httpURLResponse.statusCode == 200,
                let mimeType = response?.MIMEType where mimeType.hasPrefix("image"),
                let data = data where error == nil,
                let image = UIImage(data: data)
            else { return }
            dispatch_async(dispatch_get_main_queue()) { () -> Void in
                self.image = image
            }
        }).resume()
    }
}

但是我认为你应该考虑使用。此库为UIImageView提供了一个类别,支持来自web的远程图像。对您来说,这将更高效、更简单。

我认为问题在于,当快速滚动时,异步请求完成时,单元格可能会退出队列并重新用于另一个单元格,从而更新错误的单元格。什么是self.image?当您使用这个时?您使用的是swift,所以我建议您使用库来延迟加载图像。@Wolverine-这是一个隐藏在这里的更微妙的问题,但更根本的问题是在异步检索新图像时,无法删除回收单元的图像。