2017-02-21 48 views
0

我有一個通過this third party library製作的RSS源。滾動瀏覽tableview時遇到問題。每當我向下滾動標籤文本更改但一段時間後圖像更改。在短短的幾秒鐘內,我可以看到該行的前一張圖像。我希望看到一個默認圖像,如果它在後端加載。用於他們的演示得到這個懶加載停止在tableview中同步加載圖像

代碼是:

func loadImageSynchronouslyFromURLString(_ urlString: String) -> UIImage? { 
    if let url = URL(string: urlString) { 
     let request = NSMutableURLRequest(url: url) 
     request.timeoutInterval = 30.0 
     var response: URLResponse? 
     let error: NSErrorPointer? = nil 
     var data: Data? 
     do { 
      data = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning: &response) 
     } catch let error1 as NSError { 
      error??.pointee = error1 
      data = nil 
     } 
     if (data != nil) { 
      return UIImage(data: data!) 
     } 
    } 
    return nil 
} 

下面是從哪裏該函數獲取調用代碼:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "FeedItemCell", for: indexPath) as UITableViewCell 
     let item = entries![(indexPath as NSIndexPath).row] 
if let imageView = cell.viewWithTag(1) as? UIImageView { 
      if item.mainImage != nil { 
       imageView.image = item.mainImage 
      } else { 
       if item.imageURLsFromDescription == nil || item.imageURLsFromDescription?.count == 0 { 
        item.mainImage = UIImage(named: "roundedDefaultFeed") 
        imageView.image = item.mainImage 
       } 
       DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async(execute: {() -> Void in 
        for imageURLString in item.imageURLsFromDescription! { 
         if let image = self.loadImageSynchronouslyFromURLString(imageURLString) { 
          item.mainImage = image 
          DispatchQueue.main.async(execute: {() -> Void in 
           imageView.image = image 
           self.tableView.reloadRows(at: [indexPath], with: .automatic) 
          }) 
          break; 
         } 
        } 
       }) 
      } 
     } 
    return cell 
} 

請告訴我如何顯示空白在滾動後加載圖片。

+0

使用'asyn'加載數據。在您的'imageView'中顯示默認圖像,直到您從服務器接收到數據。 –

+0

使用[SDWebImage](https://github.com/rs/SDWebImage)第三方課程。 – Ronak

+0

@the_dahiya_boy你可以舉個例子嗎? – Dia

回答

3

UITableViewCell s被重複使用以通過避免單元實例化來提高性能。這就是爲什麼你看到「最後」的圖像,直到下載完成,你的「新」圖像被設置。

UITableViewCell有一個稱爲prepareForReuse()的方法,它在重用單元之前調用。

要解決您的問題:

子類UITableViewCell,並覆蓋prepareForReuse()和(重新)與佔位符圖像設置圖像。

或:

坐落在cellForRowAt:indexPath您的圖像佔位符:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "FeedItemCell", for: indexPath) as UITableViewCell 
    let item = entries![(indexPath as NSIndexPath).row] 
    if let imageView = cell.viewWithTag(1) as? UIImageView { 

     imageView = myPlaceholderImage // set the placeholder you want to see while downloading the image 

     if item.mainImage != nil { 
      ... 
      // your original code 
     } 

    return cell 
} 
+0

請檢查編輯問題 – Dia

+0

我的答案應該修復錯誤「每當我向下滾動標籤文本更改但在一段時間後圖像發生變化,在短短的幾秒鐘內,我可以看到該行的前一張圖像....」) 。錯誤描述沒有改變afaics。 'reloadRows'不應該被稱爲btw。 – shallowThought

+0

如何在我的視圖控制器中使用prepareForReuse方法? – Dia