2016-11-23 46 views
0

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

下面的代码:

@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并直接将图像加载到单元格的UIImageView中。

上面的代码变为:

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

谢谢!有用!创建临时变量不是个好主意( –

+0

但是我现在有另外一个问题,除了前6个,所有图像都显示正常,当我点击它们或向下滚动时,它们会显示出来,也许你知道问题出在哪里? –

相关问题