2013-12-12 55 views
0

我試圖實現像Facebook應用程序一樣的無限滾動。UITableView insertRows不鎖定主線程

看來,Facebook以某種方式插入行或重新加載表視圖而不停止當前的滾動。

有誰知道他們是如何實現這一目標的?

當我在滾動過程中調用插入行或重新加載數據時,滾動停止。任何幫助,將不勝感激。

沒有太多的代碼來提供典型的UITableView函數。

[self.tableView insertRowsAtIndexPaths:self.paths withRowAnimation:UITableViewRowAnimationNone]; 

[self.tableView reloadData]; 

self.paths被路徑最近通過下一個頁面請求加入。

我還添加了以下方法

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath; 

這與reloadData被稱爲現在正常工作。不幸的是,即使這會加速單元格的添加,它仍會鎖定當前的滾動條。

+1

你確定它不是*'insertRowsAtIndexPaths:...'之前完成的處理,它阻止了主線程?據推測你正在解析數據,創建對象等,這可以停止平滑滾動。也許你可以展示你的整個方法。 –

+0

就我的Facebook版本而言,當我到達UITableView的底部時,有一個進度指示器指示它正在加載新內容,並且我無法向下滾動,直到獲取內容。你是什​​麼意思,不停止當前的滾動? – ramzyo

+0

@ramzyo - 我的意思是,如果你擊中底部並向上滾動,它將繼續滾動而沒有任何跳躍。 – Steve

回答

1

好吧,就目前處於活動狀態的滾動停止而言,問題歸結爲一行代碼。解決方案也一樣小。

我的TableView有一個刷新控制。在我接收TableView的下一組數據的方法中,我將調用以下內容。

  [refreshControl endRefreshing]; 

我的假設是,如果它不刷新,endRefreshing將無所作爲。

呃......顯然情況並非如此。當您在不刷新的刷新控件上調用endRefreshing時,將停止tableview滾動。我的修復如下。

 if(refreshControl.isRefreshing){ 
     [refreshControl endRefreshing]; 
    } 

現在滾動在下一次加載後繼續,儘管有一些延遲。當然這個延遲更容易調試。

這就是開銷參與計算所添加的細胞被稱爲所有單元格的高度時,重載被稱爲除非你有

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath; 

只是約所以,現在,我把一切都整理出來它的時間創建一個有效的方法來計算合理接近的估計高度。

+0

我的建議是在解析數據時計算並緩存高度。在細胞即將出現在屏幕上時,您只需返回預先計算的值即可。 –

+0

我跟你的建議去了。我有一個運行新單元高度計算的後臺線程。完成後,我在主線程上重新加載我的表格。現在令我感到驚奇的是,如果我正在滾動現有的單元格,當重新加載被調用時,我仍然會看到這種輕微的停頓。當然,現在它還沒有與Facebook應用重新加載的速度競爭。仍然有一些缺失,但我懷疑它是行的單元格,現在高度從數組中返回一個浮點數。關於還有什麼可能是問題的想法? – Steve

+0

也許你應該提前開始加載過程?不要等到他們在最後一個單元格時纔開始,而應該從最下面的10個單元格開始。 –