2017-02-16 33 views
0
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! ViewAllCell 


     stringClassObj = stringClassArray[indexPath.row] 

     cell.modelNameLbl.text = stringClassObj.model 
     cell.brandLbl.text = stringClassObj.vehicleTitle 
     cell.fuelTypeLbl.text = stringClassObj.fuelType 
     cell.priceLbl.text = stringClassObj.Price 
     cell.discountLbl.text = "5%" 

     let URLBaseString = "http://vehiclebuzzzz.com/" 

     let url = URL(string:URLBaseString .appending(stringClassObj.vehicleImage!)) 

     DispatchQueue.global().async 
      { 
       let dataurl = try? Data(contentsOf: url!) 
       DispatchQueue.main.async 
        { 
         cell.productImageView.image = UIImage(data: dataurl!) 

       } 
       self.tableViewObj.reloadData() 

     } 

     return cell 
    } 
+0

** self.tableViewObj.reloadData()**你爲什麼圖像中調用此加載方法 –

+0

正在調用之前返回單元格是合適的 –

+0

它將重新加載整個tableview一次.. –

回答

0

原因是你正在加載數據在後臺隊列,這需要一段時間,一旦數據可用,你更新單元格(在主線程中,這是正確的)。但是,在數據加載完畢後,您可以上下滾動表格視圖,因此單元格消失可能位於頂部,並將在底部重新用於其他數據。現在背景加載已經完成了finisehd(舊的單元格的圖像數據已經在頂部消失了),並且更新了重用的單元格,這應該顯示出不同的東西。

怎麼辦:

  • 不要存儲在後臺關閉到UICellView的引用,但存儲索引路徑
  • 當主線程更新,檢查圖像路徑仍清晰可見,然後獲取屬於該路徑的單元並更新它。

也有一個很好的教程由蘋果公司(也表現出了一些WWDC年前): https://developer.apple.com/library/content/samplecode/LazyTableImages/Introduction/Intro.html

+0

你能給我一些這個例子im新的 –

+0

@Yerra,只需檢查LazyTableImages示例。它涵蓋了幾乎所有你想要的,包括停止不再需要的數據下載。我認爲只是嘗試理解Apple的解決方案並且將其翻譯成Swift(並將其放在github上)會是一次很好的培訓。我也可以做到這一點,如果你陷入困境,但不是在今晚(德國時區)之前。 –

+0

謝謝我明白了 –

0

試試這個 -

創建一個UIImageView擴展

extension UIImageView { 
public func imageFromServerURL(urlString: URL) { 

    URLSession.shared.dataTask(with: urlString, completionHandler: { (data, response, error) -> Void in 

     if error != nil { 
      print(error as Any) 
      return 
     } 
     OperationQueue.main.addOperation { 
      let image = UIImage(data: data!) 
      self.image = image 
     } 

    }).resume() 
    } 
} 

和更新cellForRowAt如下 -

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
{ 
    let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! ViewAllCell 


    stringClassObj = stringClassArray[indexPath.row] 

    cell.modelNameLbl.text = stringClassObj.model 
    cell.brandLbl.text = stringClassObj.vehicleTitle 
    cell.fuelTypeLbl.text = stringClassObj.fuelType 
    cell.priceLbl.text = stringClassObj.Price 
    cell.discountLbl.text = "5%" 

    let URLBaseString = "http://vehiclebuzzzz.com/" 
    let url = URL(string:URLBaseString .appending(stringClassObj.vehicleImage!)) 

    cell. productImageView.imageFromServerURL(urlString: url!) 
    return cell 
} 

而且您的自定義單元格類中添加`prepareForReuse」的方法 -

override func prepareForReuse() { 
    super.prepareForReuse() 
    //here set all control values to nil like below 
    self.productImageView.image = nil 
} 

希望它會工作:)

+0

這是一個棘手的想法!但是對於這種特殊情況,它有一個小缺點:如果你有很多單元並且滾動速度很快,它會繼續加載已經滾動的數據「看不見」,所以沒有辦法停止隱形下載細胞。蘋果解決方案(來自我的答案)將停止下載已經變得不可見的單元格。 –

相關問題