2011-11-06 77 views
2

我有一個最多9個控制器的TabBar控制器,每個控制器都有一個導航控制器。目前,我alloc和在iOS5如何「懶洋洋地」初始化標籤欄的控制器?

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{...} 

初始化程序委託中他們每個人這使我的應用程序需要相當長一段時間,首次啓動時啓動。我想通過延遲初始化來減少初始加載時間。

當初次選擇標籤欄時,有沒有辦法「懶惰」初始化視圖控制器

將研究iOS5的故事板可以幫助我解決這個問題嗎?

謝謝!

+0

它不應該花這麼長的時間來分配init視圖控制器。你可能需要優化它們,並確保這些ViewController加載他們的資源懶惰...提示:viewDidAppear –

回答

3

把你的控制器定義爲懶控制器怎麼樣?

我的意思是,如果應用程序由於初始化九個視圖控制器而需要一些時間啓動,那麼這與控制器在初始化時實際執行的操作有關。所以,你可以通過兩個步驟使控制器懶惰地初始化:一是,當你將所有的控制器添加到標籤欄控制器時;二,當你選擇一個特定的選項卡時,相應的控制器被初始化。

我認爲這是最乾淨的方法。

否則,我敢打賭直接使用UITabBar來管理它在你自己的標籤欄控制器類。

作爲最後一個選項,我會嘗試根據某些邏輯在適當的時間通過調用setViewControllers:animated:來動態更改標籤欄控制器的內容。例如,你可以在application:didFinishLaunchingWithOptions:只有5視圖控制器初始化標籤欄控制器,然後在稍後的時刻添加休息...

但我的實際建議是使組件控制器偷懶......

編輯:閱讀在評論你的問題......

,如果你想給一個嘗試到您的控制器的延遲初始化後,我的意思是以下幾點:

  1. 您將初始化控制器(或UIKi通過調用[[... alloc] init ...]來加載nib時)這並沒有改變;

  2. init方法會將控制器初始化爲其默認狀態,如設置屬性和伊娃值,並且不做任何更復雜的操作;

  3. 在控制器視圖顯示之前,您通過調用特定方法完成其初始化;這將貫穿「相當多的授權」部分,我認爲這是初始化的冗長部分。

很抱歉,如果談到「懶惰初始化」引起了組件的邏輯初始化和init方法的內容之間的歧義。

至於第3點,您有幾個關於在哪裏完成初始化的選項。

可能性是控制器即將顯示的時間。在這種情況下,您可以在標籤欄控制器代理中定義-tabBarController:didSelectViewController:,或者使用viewWillAppear。這會給你所有的最懶的初始化,但是當你在視圖出現之前選擇標籤的時候,它可能會增加一些延遲。

更好的是使用viewDidLoad,這會給你一種不那麼懶惰的初始化;初始化全部您的控制器會在您不控制的某個時間點發生(當然,在顯示視圖之前),所以它可能會延遲一些事情,但這不會發生在applicationDidFinishLoading之內,並且會更多UI友好,因爲它將由主循環控制。絕對是第一個嘗試的選擇。另請參閱UIViewController referenceviewDidLoad的說明。

最後是關於單獨線程的說明。請記住,從單獨的線程使用UIKit並非都是安全的,所以要小心。

+0

關於設置視圖控制器的好主意!我注意到,由於我的控制器在「更多」選項卡上溢出,用戶可以選擇編輯控制器的順序。我不知道這個訂單重新排列是否通過應用程序重新啓動持續存在。如果是這樣,這是一個很酷的功能,我不想失去。 –

+0

我所有的視圖控制器都是由Nibs創建的,並且有相當多的代表正在進行。糾正我,如果我錯了,只有alloc'd的對象只是一堆內存,所以我不能指定它的屬性。我想到的一件事是在didFinishLaunchingWithOptions內創建一個後臺任務,並讓它處理所有長時間運行的操作,如預先分配一些內存。 –

+0

關於重新排列:我不認爲順序重排持續;你將不得不堅持下去......也看到我的進一步編輯你的其他評論... – sergio

1

在你執行的UIViewController的創建方法

- (void)viewDidLoad 

所有的意見,並避免創建視圖(或更糟獲取數據)在你的init方法。

UITabBarController或UINavigationController默認會在用戶看到它之前調用viewDidLoad。

+0

我認爲適當的地方是編程創建視圖是' - [UIViewController loadView]',而不是' - [UIViewController viewDidLoad]'。在Xcode 4.x中的 –

+0

當我創建一個新的UIViewController子類時,我得到的只有init和viewDidLoad。我可以確認viewDidLoad被懶惰地調用。 –

2

感覺就像在這個問題中添加了一個快速的.02。正如其他人所指出的那樣,UIViewController的初始化和加載過程已經是「懶惰」了。真正的問題是你在初始化過程中做了多久?即使加載視圖也不需要很長時間,因爲您不希望用戶在視圖更改之前點擊選項卡時等待。我建議如下:

  1. 在init中,儘量少做。 init的目的是讓獨立數據已經初始化並準備就緒。你不應該在這裏加載任何視圖。

  2. loadViewviewDidLoad創建您的所有意見/子視圖。

  3. 只在需要時才加載數據。如果您在初始化時需要它,請將其加載到那裏。如果您可以等待視圖加載,請在viewDidLoad中執行此操作。如果加載數據佔用大量時間,請將其加載到後臺。

相關問題