我有一個UITableView
約500項。TableView scrollToRow阻止主UI線程
當我打電話tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)
主UI線程被阻止3秒。
有沒有辦法解決這個問題?或者是滾動500個項目的問題?
感謝
的問題不在於reloadData
它與scrollToRow
我有一個UITableView
約500項。TableView scrollToRow阻止主UI線程
當我打電話tableView.scrollToRow(at: indexPath, at: .bottom, animated: false)
主UI線程被阻止3秒。
有沒有辦法解決這個問題?或者是滾動500個項目的問題?
感謝
的問題不在於reloadData
它與scrollToRow
從有關如何使用表格視圖聊天討論: 我們可以使用它使用一個轉換翻轉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。
使用時間分析器,以查明究竟是問題。事情是,一般UITableView
性能不受多個項目加載影響。視圖本身將加載儘可能多的項目,以滿足整個屏幕的需要。
您可以通過在cellForRowAtIndexPath
中記錄一個方法來測試。所以我猜測這種方法可能會很慢。檢查你如何訪問它的數據,也許有一些重要的邏輯。或者單元格佈局可能被竊聽並且非常緩慢。
在一般情況下,如果您的數據量非常大,請考慮使用核心數據和專門爲此設計的NSFetchedResultsController
。但是請注意,在表格視圖中加載500個元素應該沒有任何特別的優化就能順利運行。
你應該這樣做;如果用戶從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];
}
}
這不是一個好主意,你將獲得滾動滯後的用戶體驗,並在一般情況下,爲什麼你會重新加載任何滾動事件中的所有數據。這將凍結應用程序更多 – zero3nna
我不是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)
}
}
}
}
您應該使用延遲加載。它會幫助你更平滑的滾動。 –
你能展示你的代碼嗎? – Sneha
@ kayzersoze什麼應該是懶惰? tableView? – ilan