2011-06-08 48 views
2

我有兩個視圖,第一個是簡單的視圖,有一些關於使用的介紹,通過點擊一個按鈕它打開主視圖。主視圖有許多圖像和兩個定製的表格,其中行由文本和圖像組成,因此主視圖的創建非常緩慢。 Profiler顯示大部分時間都是由imageIO消耗的(decode_mcu,png_read_filter_row,pmap_copy_page和decompress_onepass)如何在後臺「準備」一個視圖?

我想通過在加載第一個視圖後立即創建主視圖進行優化,並且當我單擊該按鈕時,它只是簡單地將該視圖設置爲可見或將該視圖置於前面。

我試過的Alloc &初始化主視圖中的第一個視圖的viewDidLoad

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    rootVC = [[RootViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 
    rootVC.delegate = self; 


} 

,並在按鈕的操作方法

- (IBAction)buttonUp:(id)sender { 
    [self.view addSubview: rootVC.view]; 
} 

這樣做,但這種不工作時,裝載仍然需要很長。我如何犧牲一些記憶來改善用戶體驗?

感謝

利奧

回答

8

你應該:

  1. 使用儀器,看看你的代碼花費了大部分時間,並優化那裏。它可能不是你想象的地方。

  2. 如果您使用的是UITableView,請了解如何根據需要創建UITableViewCells(而不是預加載大量數據)並回收實例(而不是重新創建它們)。

  3. 只有儀器指出這是瓶頸:嘗試在後臺隊列中加載/解壓縮映像,然後在加載後更新主隊列上的UIImageView(或其他)。

在iOS系統中4.x或更高版本,你可以這樣做:

NSString *path = ... 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{ 
    // This is happening in the background thread. 
    UIImage *image = [UIImage imageWithContentsOfFile:path]; 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // This is happening on the main thread; all UI updates must happen here. 
     imageView.image = image; 
    }); 
}); 

附:順便說一下,UIViewController不會在創建時加載視圖,而是按需加載。因此根據上面的代碼,表達式rootVC.view可能觸發加載視圖。如果您想強制加載它,只需在其他地方放置rootVC.view即可。

+0

感謝您的回覆。 1.儀器分析器顯示imageIO正在使用我大部分的CPU時間; 2.初始可見表格顯示6行,我無法避免。我相信我正在正確地重用實例; 3.你能分享更多有關在後臺加載圖像的信息嗎? Thx – leo 2011-06-08 17:35:40

+0

我編輯了我的答案,並添加了一些示例代碼,但如果你只有6行,imageIO是瓶頸,我懷疑你的圖片*方式*太大。 Retina屏幕上的iPhone屏幕至多爲640x960。 – benzado 2011-06-09 15:36:46

4

UIViewController試圖延遲加載它的視圖,即直到實際需要時才加載視圖。如果你真的想強制你的視圖控制器加載它的視圖,你只需要訪問它的視圖屬性,例如rootVC.view。

但是,你真的不應該這樣做。例如,表格視圖只能創建在屏幕上可見的單元格,所以行數不太可能會顯着影響加載視圖的時間。有一點需要注意的是,有些東西確實會減慢桌子的視野。例如,如果您在具有很多行的表格中使用可變高度單元格,那麼可能會減慢表格的創建速度。儘量不要那樣做。

@benzado提供了一些改善性能的好方法。試圖對抗Cocoa-Touch總是一個痛苦的祕訣,所以試着找出爲什麼你的看法花了這麼長的時間來加載。你的應用程序花費在哪裏?你能做些什麼來減少負載?

相關問題