2013-12-15 52 views
0

我正在使用UINavigationController開發iOS應用程序。我遇到性能問題,每次加載視圖時,加載新視圖所需的時間增加約0.1秒。我希望有人能就如何解決這個問題提供一般性建議。性能問題:隨時間推移增加查看時間

我在下面列出了性能分析數據。似乎沒有任何無限的增長或內存泄漏。

關於應用程序的更多信息:它具有相當數量的視圖(高於20),並且具有相當複雜的許多不同的自定義單元格的表格視圖。我使用了一個基本的viewcontroller,它包含了我爲每個視圖控制器分類的所有tableview和導航代碼。

enter image description here enter image description here

這裏是一個加載出現此性能問題上的視圖的示例代碼:

-(IBAction)evaluateTapped:(id)sender 
{ 

    NSArray *arrayOfPropertiesToLoad = [self.sharedStore requestAnArrayOfObjectsWithEntityDescription:@"Property" forWhichAttribute:@"isEvaluated" isEqualTo:[NSNumber numberWithBool:YES]]; 

NSArray *sortedArray = [[OzStore sharedStore] sortArray:arrayOfPropertiesToLoad withKey:@"id" ascending:NO]; 
    NSMutableArray *mutSortedArray = [NSMutableArray arrayWithArray:sortedArray]; 

    OzEvaluatePropertyListViewController *propertyList = [[OzEvaluatePropertyListViewController alloc] initWithNibName:nil bundle:nil withSortedDataArray:mutSortedArray useCellClass:@"OzPropertyCell" withUnit:nil]; 

    [self.navigationController pushViewController:propertyList animated:YES]; 
} 
+0

您是否嘗試過時間分析以查看額外時間內發生了什麼?另外,在視圖創建周圍顯示一些代碼 - 那裏有任何循環嗎? – Wain

+0

除了Time Profiler工具,您還可以在代碼中的各個點處放置CFAbsoluteTimeGetCurrent()調用,並查看大部分時間花費的位置。 – yurish

+0

我使用時間分析,並且似乎所有耗時的最耗時的方法都隨時間增加。最上面的方法是cellForRowAtIndexPath。我有很多子視圖的自定義UITableViewCells,我認爲這會傷害我的表現。然而,這並不能解釋爲什麼我的表現會隨着時間的推移而惡化。 – ChemDev

回答

0

我想通了!經過大量廣泛的測試後,我意識到,每次加載和彈出視圖控制器時,導致達到viewWillAppear的方法的時間都大致相同。然而,每次加載視圖時,從viewWillAppearviewDidAppear之間的時間增加了大約0.1秒。使用計時器進行分析顯示layoutSubViews所花的時間越來越長。

原來我有以下代碼中的所有我的視圖控制器的父viewDidLoad方法:

[self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"bluecool"] forBarMetrics:UIBarMetricsDefault]; 


    NSDictionary *a = [NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Avenir-Light" size:20], NSFontAttributeName, 
    [UIColor whiteColor], NSForegroundColorAttributeName, nil]; 

    [[UINavigationBar appearance] setTitleTextAttributes:a]; 

每次的viewDidLoad被稱爲它必須已經被添加的背景圖像的附加層到導航酒吧。我只是將此代碼移至appDelegate,因此僅調用該代碼並解決了問題。

相關問題