使用 UIImageView+AFNetworking,图像直到滚动才会出现

Posted

技术标签:

【中文标题】使用 UIImageView+AFNetworking,图像直到滚动才会出现【英文标题】:Using UIImageView+AFNetworking, images doesn't appear until scrolling 【发布时间】:2016-11-23 22:50:09 【问题描述】:

我正在使用UIImageView+AFNetworking 在表格单元格中加载图像,但是 从服务器下载的图像不会显示在单元格中,直到再次向下和向上滚动。我以为我需要在tableView 中重新加载数据,但我不知道将所述重新加载代码放在哪里。

代码如下:

@IBOutlet weak var refresherTool: UIRefreshControl!



override func viewDidLoad() 
    super.viewDidLoad()


    let _ = dataRefresher.sharedInstance.refreshVideos(fromUrl: "https://api.vid.me/videos/featured", withLimit: "100", withOffset: "0", completion: 
        featuredVideos in dataRefresher.sharedInstance.featuretVideos = featuredVideos
        DispatchQueue.main.async 
            self.tableView.reloadData()
        
    )



@IBAction func refreshBtn(_ sender: UIRefreshControl) 
    let _ = dataRefresher.sharedInstance.refreshVideos(fromUrl: "https://api.vid.me/videos/featured", withLimit: "100", withOffset: "0", completion: 
        featuredVideos in dataRefresher.sharedInstance.featuretVideos = featuredVideos
        self.refresherTool.endRefreshing()
        DispatchQueue.main.async
            self.tableView.reloadData()
        
    )
    refresherTool.endRefreshing()



override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if dataRefresher.sharedInstance.featuretVideos == nil 
        return 0
    
    return 100



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "featuredCell", for: indexPath)
    //  if dataRefresher.sharedInstance.featuretVideos == nil  return cell
    let newImage = UIImageView()
    newImage.setImageWithUrl(URL.init(string: dataRefresher.sharedInstance.getVideosThumbnailUrls(fromVideos: dataRefresher.sharedInstance.featuretVideos)[indexPath.row])!, placeHolderImage: #imageLiteral(resourceName: "first"))
   // newImage.setImageWithUrl(URL.init(string: urls[indexPath.row])!)
    cell.imageView?.image = newImage.image

    cell.textLabel?.text = dataRefresher.sharedInstance.getVideosTitels(fromVideos: dataRefresher.sharedInstance.featuretVideos)[indexPath.row]

    print(indexPath.row)
    print(newImage.image!)
    return cell

【问题讨论】:

【参考方案1】:

setImageWithUrl 方法是异步的,这意味着如果引用的图像还没有在本地缓存中,它只会在未来的某个时间被下载。

但是,您的代码会尝试立即获取图像:

let newImage = UIImageView()
newImage.setImageWithUrl(..., placeHolderImage: ...)
cell.imageView?.image = newImage.image <-- synch call, image is nil here at first!

幸运的是,无需重新加载表格视图或执行任何其他神秘技巧;停止做不必要的事情。

移除临时的UIImageView,直接将图片加载到cell的UIImageView中。

上面的代码变成:

cell.imageView?.setImageWithUrl(..., placeHolderImage: ...)

【讨论】:

谢谢!!有用!创建临时变量( 但是我现在有另一个问题,除了前 6 个图像,所有图像都显示正常,当我单击它们或向下滚动时它们显示,也许你知道问题出在哪里?

以上是关于使用 UIImageView+AFNetworking,图像直到滚动才会出现的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cocoapods 管理多个目标的依赖关系

UIImageView的基本使用

如何使用 UISlider 旋转 UIImageView?

使用 AutoLayout 缩放 UIImageView 以适应宽度

使用缩放在 UITableViewCell 中缩放 UIImageView

如何使用 TouchesMoved 旋转 UIImageView