2014-06-18 104 views
0

我有一個UIPageViewController,其中每個頁面的視圖都包含一個UITableView。我想在控制器之間進行分頁時提高性能。通過預先加載單元格來提高UITableView的性能

我在一個方便的時刻預先加載了當前頁面的一些控制器,並要求他們的視圖來確保提前提交所有內容。但是,真正的瓶頸實際上是tableview中的細胞,沒有得到預先加載:

MyViewController *vc = [[MyViewController alloc] initWithNibName:nil bundle:nil]; 

[vc view]; 
NSLog(@"view: %@", vc.view); // view exists 

[vc tableview]; 
NSLog(@"tableview: %@", vc.tableview); // tableview exists 

UITableViewCell *cell = [vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
NSLog(@"cell: %@", cell); // cell is null?? 

如記錄顯示,細胞本身不會被加載,直到實現代碼如下實際上將出現在屏幕上。

我該如何請求屏外UITableView提前將其可見單元出列?

+0

單元格的外觀如何?你有分析過嗎?聽起來這可能是一個圖像解壓縮的問題,在這種情況下,你可以做出一些明確的優化。你能提供一個單元格的屏幕截圖嗎? –

+0

沒有圖像,當然我可以在一定程度上優化單元格。但我最感興趣的是爲什麼即使明確要求tableview也不加載單元格。 –

回答

3

它返回零,因爲當你調用[vc.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];你調用表視圖對象的方法,而不是你的數據源(即你的視圖控制器)。

這是不一樣的表視圖呼喚你的數據源(即視圖控制器)上- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath這是創建單元,其中,由你。

您調用的方法要求表視圖返回已傳遞給您的索引路徑的單元格。由於tableview在此階段沒有要求您的數據源用於任何單元格(因爲它不是可見),它沒有細胞給你,因此零返回。

如果要預加載單元格,可以在後臺線程上創建第一批次,爲最初的行製造索引路徑,並要求數據源返回單元格。將它們存儲在一個數組中,然後讓您的實現- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath在表視圖請求它們時從數組中返回數組中初始化的單元格。

+0

非常有趣,謝謝。我想知道有多少性能特徵與細胞創建相關,而將細胞添加到視圖中。像這樣的預加載將改善前者,但不是我懷疑的後者。希望這已經足夠了 - 我會分析並返回。 –

+0

我也在嘗試一些狡猾的方法來確定爲一個屏幕值的內容預加載多少個單元;在tableview出現之前,visibleCells毫不奇怪是0。 –

+0

很好,謝謝。還有很多改進的餘地 - 下一步可能是在桌面視圖之間共享重用隊列。 –