2017-02-23 56 views
1

我有一個UITableView約500項。TableView scrollToRow阻止主UI線程

當我打電話tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)主UI線程被阻止3秒。

有沒有辦法解決這個問題?或者是滾動500個項目的問題?

感謝


的問題不在於reloadData它與scrollToRow

+0

您應該使用延遲加載。它會幫助你更平滑的滾動。 –

+0

你能展示你的代碼嗎? – Sneha

+0

@ kayzersoze什麼應該是懶惰? tableView? – ilan

回答

2

從有關如何使用表格視圖聊天討論: 我們可以使用它使用一個轉換翻轉Y座標表視圖。然後,我們需要爲每個單元做同樣的事情,這樣它們就不會顛倒過來。

該過程是建立一個正常的消息傳遞表視圖,其中最新的消息在頂部(而不是底部)。然後把一些上海華表視圖和反轉其座標系統:

chatContainer?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0) 

包含的消息的電池也應該有某種SuperView已經全部內容需要被翻轉:

override func awakeFromNib() { 
     super.awakeFromNib() 

     containerView?.transform = CGAffineTransform(scaleX: 1.0, y: -1.0) 
    } 

所以細胞基本上翻轉了兩次,所以顯示正確。

您可能會找到一個示例項目here

+0

非常感謝你......完美的作品。 – ilan

+0

一個評論,你可以轉換單元格和tableView本身不需要轉換容器。 – ilan

+0

我知道你可以,但我勸你不要這樣做。表格視圖可能會在內部直接對單元格進行一些調整,如果您將轉換分配給它們,則單元格可能會中斷。整個表格視圖也是如此。所以請謹慎使用。 –

0

使用時間分析器,以查明究竟是問題。事情是,一般UITableView性能不受多個項目加載影響。視圖本身將加載儘可能多的項目,以滿足整個屏幕的需要。

您可以通過在cellForRowAtIndexPath中記錄一個方法來測試。所以我猜測這種方法可能會很慢。檢查你如何訪問它的數據,也許有一些重要的邏輯。或者單元格佈局可能被竊聽並且非常緩慢。

在一般情況下,如果您的數據量非常大,請考慮使用核心數據和專門爲此設計的NSFetchedResultsController。但是請注意,在表格視圖中加載500個元素應該沒有任何特別的優化就能順利運行。

+0

謝謝你,我的錯誤塊是不是從reloadData。 加載後,我滾動到tableView的底部,並阻止線程。 tableView.scrollToRow(在:indexPath在:.bottom,動畫:假) – ilan

+0

任何建議如何解決這一問題? – ilan

+0

很好,可能是一個問題。你有固定的細胞高度嗎?也許嘗試手動計算偏移量並使用setContentOffset。我不確定它是否會解決它,但嘗試。 –

0

你應該這樣做;如果用戶從tableview的頂部向下滾動scrollview委託方法激發其「scrollViewDidScroll」方法,並檢測用戶底部的tableview或沒有,然後獲取其他數據並追加你的數組並重新加載tableview。而已!

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{ 
    CGFloat actualPosition = scrollView_.contentOffset.y; 
    CGFloat contentHeight = scrollView_.contentSize.height - (someArbitraryNumber); 
    if (actualPosition >= contentHeight) { 
     [self.newsFeedData_ addObjectsFromArray:self.newsFeedData_]; 
     [self.tableView reloadData]; 
    } 
} 
+0

這不是一個好主意,你將獲得滾動滯後的用戶體驗,並在一般情況下,爲什麼你會重新加載任何滾動事件中的所有數據。這將凍結應用程序更多 – zero3nna

0

我不是100%肯定這個解決方案,並沒有有這個問題我自己。 也許只是發送它?

extension UITableView { 

func tableViewScrollToBottom(animated: Bool) { 

     DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { 

      let numberOfSections = self.numberOfSections 
      let numberOfRows = self.numberOfRows(inSection: numberOfSections-1) 
      if numberOfRows > 0 { 
       let indexPath = IndexPath(row: numberOfRows-1, section: (numberOfSections-1)) 
       self.scrollToRow(at: indexPath, at: UITableViewScrollPosition.bottom, animated: animated) 
      } 
     } 
    } 
} 
+1

不應該滾動在UI線程上? – ilan

+0

是的,那是我也有它的問題。你試過了嗎?另一方面,你不是動畫。我見過一些例子調度它(http://stackoverflow.com/questions/26244293/scrolltorowatindexpath-with-uitableview-does-not-work),但我不能真正測試了這一點現在。 – zero3nna

+0

無法正常工作。 它不滾動,然後當用戶滾動它崩潰與線程問題 – ilan