2016-11-23 45 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個,所有圖像都顯示正常,當我點擊它們或向下滾動時,它們會顯示出來,也許你知道問題出在哪裏? –

相關問題