2011-12-13 68 views
15

時間分析器顯示我的應用中最耗時的操作是從nib文件加載UITableViewCells。其中最昂貴的是使用4KB圖像加載UITableViewCell以編程方式創建UITableViewCell或從筆尖加載UITableViewCell更快嗎?

我加載從筆尖UITableViewCell用下面的代碼:

[[NSBundle mainBundle] loadNibNamed:@"UITableViewCellPortrait" owner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

有沒有人比編程方式創建一個視圖或從筆尖加載UITableViewCell之間的區別?

編輯:
我比較了從一個筆尖加載UITableViewCell反覆運行的時間配置文件,並以編程方式創建視圖。我的測試涉及在3-5秒的範圍內交替兩次UITableViews約10次。在每次測試中,以編程方式加載UITableViewCell的速度要快得多,速度要快兩倍到六倍。

任何人都可以證實這些結果嗎?

編輯: 我更新了筆尖加載代碼,只加載一次筆尖文件,並使用緩存版本進行後續調用。

if (self.UITableViewPortaitNib == nil) { 
     self.UITableViewPortaitNib = [UINib nibWithNibName:@"UITableViewCellPortrait" bundle:[NSBundle mainBundle]]; 
    } 

    self.UITableViewPortaitNib instantiateWithOwner:self options:NULL]; 
    cell = portraitCell; 
    self.portraitCell = nil; 

我還使用了自動化儀表創造更一致的運行,結果還是建議裝載UITableViewCells編程比裝載UITableViewCells的筆尖更快。從筆尖加載UITableViewCells的平均運行時間約爲90毫秒,而以編程方式創建UITableViewCell的平均運行時間爲50毫秒。

+0

向我們展示您的筆尖加載代碼。 –

+0

感謝您看看@robmayoff。我更新了問題以包含加載筆尖的代碼。 – Eytan

+0

有趣的發現 - 你將能夠使用故事板和原型單元再次運行實驗,其中表視圖在後臺加載所有的筆尖嗎? – jrturton

回答

13

嘗試創建一個UINib對象一次,然後發送它instantiateWithOwner:options:每次您需要創建一個新的單元格。從UINib Class Reference

例如,如果你的表視圖使用榫文件實例表格視圖單元,緩存筆尖在UINib對象可以提供一個顯著的性能提升。

+0

哇,幫了很多!使用您提到的技術從NIB進行加載時,平均運行時間(有神論者的持續時間)從300毫秒下降到90毫秒。以編程方式加載,平均運行時間約爲50毫秒。 – Eytan

2

我加載筆尖細胞(cellTemplate)一次,並複製它根據需要,所以在某種意義上,這方法是基於兩個方案筆尖。

複製比我預期的更復雜,因爲mutableCopy沒有工作。一個NSKeyedArchiver往返沒有,但是:

NSData* cellData = [NSKeyedArchiver archivedDataWithRootObject:cellTemplate]; 
cell = [NSKeyedUnarchiver unarchiveObjectWithData:cellData]; 

事實上,如果你打算爲原料,熾烈,踏板到的金屬速度,甚至歸檔模板可以被計算一次,並緩存。

但是你不應該測量幀率嗎?在這種情況下,UIView的複雜性也會發揮作用。

+0

明天早上我將嘗試使用密鑰存檔方法。 您在關於幀速率的一個好處點。我開始分析最快的方法到UITableViewCells的原因是因爲我的方向更改動畫速度非常慢。在這個動畫中,我在兩個UITableViewControllers之間轉換,並且時間分析器突出顯示了當我加載UITableViewCells時最重的堆棧跟蹤發生。你有關於如何加快幀頻的建議嗎? – Eytan

0

有可能重新使用一次加載的uitableviewcell筆尖,然後它們離開視圖。閱讀以下內容:

iPhone - What are reuseIdentifiers (UITableViewCell)?

+0

你有一個好點的桑傑。在我的筆尖加載代碼上方的幾行我檢查具有適當的重用標識符的單元格。 – Eytan

5

在iOS 5中,並在WWDC 2011條的視頻中提到,存在使用UINib一個較新的方法。您在viewDidLoad:方法中註冊您的筆尖,然後簡化tableView:cellForRowAtIndexPath:方法中的代碼。這可能會加快你的速度(但我從來沒有執行任何比較計時)。

例子: 在你viewDidLoad:註冊筆尖並保留對它的引用:

NSString *myIdentifier = @"ReusableCustomCell"; 
[self.reuseCustomCell registerNib:[UINib nibWithNibName:@"ReusableCustomCell" bundle:nil] forCellReuseIdentifier:myIdentifier]; 

在你tableView:cellForRowAtIndexPath:方法只要求細胞(無需檢查爲零,因爲它是保證返回cell),並配置該單元:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *myIdentifier = @"ReusableCustomCell"; 

    ReusableCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:myIdentifier]; 
    // Your configuration code goes here 
    cell.nameLabel.text = @"some text"; 
    // .... 

    return cell; 
} 

代碼未經測試。如果這比單獨使用UINib更快,我會感興趣。

+0

這與我在第二次編輯時使用UINib基本相同。我無法想象它會更快,但編程當然更好。我打算從現在開始 - 謝謝! – Eytan

+0

什麼是「self.reuseCustomCell」指的是? – zakdances

+0

self.reuseCustomCell是@property(nonatomic,strong)id reuseCustomCell行的屬性; –

相關問題