2016-11-24 64 views
3

This video demonstrates the issue I'm visually having.tableView.reloadRows閃爍如果另一個表更新

每個之後調用太快所以很多時候,我有這樣的塊稱爲:

self.tableView.beginUpdates() 
self.tableView.insertRows(at: [indexPath], with: rowAnimation) 
self.tableView.endUpdates() 

self.tableView.scrollToRow(at: indexPath, at: scrollPosition, animated: true) 
self.tableView.reloadRows(at: [indexPath], with: .automatic) 

讓我們不要詢問太多(的insertRows呼叫和立即重載行程)。這是解決SlackTextViewController中的錯誤的建議解決方案。 The bug in question for those curious.

現在,在其他地方,我呼籲:

self.tableView.reloadRows(at: [indexPath], with: .automatic)

當我們在處理這兩種情況下相同的indexPath,你會遇到一個閃爍如果這些兩個塊太快運行。

我會發現通過使用dispatchQueue(:asyncAfter)方法人工延遲self.tableView.reloadRows(at: [indexPath], with: .automatic)的第二個電話很棘手。

我怎麼能處理這個?

更新:現在,我已經通過使用dispatchQueue(:asyncAfter)方法來解決此問題,以避免競爭條件。我想盡量避免這種情況,所以當我尋找其他答案時,我會保持這種狀態。

+0

是否有任何原因同時重新加載和插入?應該只是調用其中的一個 – Tj3n

+0

原始塊是由於我鏈接的問題。另一個調用發生在完成塊中,完成塊被調用的速度取決於互聯網連接。 – David

回答

3

基於您的評論,如果第二呼叫的網絡呼叫之後發生在完成塊,我猜你正在使用的網絡調用的結果。如果是這種情況,如果您需要在單元格中反映的更改不會影響單元格的高度,則可以將單元格放在索引路徑中,檢查它是否爲零(以防用戶將其滾動到屏幕外)如果單元格仍然可見,則直接應用更改。不需要重新加載。

+0

我會探討這個! – David