2010-10-22 64 views
0

我想創建一個在我的應用程序中執行一些初始加載的View/Window。我想是這樣的:在iPhone上創建自定義加載屏幕

StartWindow *start = [[StartWindow alloc] initWithNibName:@"Start" bundle:nil]; 

self.startWindow = start; 

[start release]; 

[window addSubview:startWindow.view]; 

而且在裏面StartWindowviewDidLoad事件暫時我只是[NSThread sleepForTimeInterval:3.0];模擬加載我。

問題是我的視圖直到線程完成睡眠後才顯示。 爲什麼?

編輯

上面的代碼是內部didFinishLaunchingWithOptions

+0

我一點也不確定,但是這個結果似乎表明viewDidLoad事件在視圖變得可見之前觸發。你爲什麼不嘗試在viewDidAppear處理程序中睡覺? – 2010-10-22 10:03:33

回答

1

因爲框架正在等待您完成初始化視圖viewDidLoad。如果你想在後臺進行加載,你必須使用某種後臺處理工具,比如單獨的線程或NSOperationQueue。

順便說一句,sleepForTimInterval實際上並不在一個單獨的線程中運行。它使調用線程休眠(在這種情況下,主UI線程)。

+0

那麼有什麼我可以做的,以解決它?我不想在後臺加載,我想在加載後顯示有關加載的信息,因此我想等到它完成。 – 2010-10-22 10:04:53

+0

然後,您需要在單獨的線程中完成該工作,該工作完成後向主線程發出信號。低級線程可以通過'performSelectorOnMainThread'來完成。 NSOperationQueue可能有自己的信號機制,但我沒有太多用處。 – 2010-10-22 10:12:38

+0

你有沒有關於如何開始使用'performSelectorOnMainThread'的例子?我仍然認爲這不能解決我的問題。在此視圖加載並顯示數據後,我將其移除並顯示另一個視圖,這就是爲什麼我要等待它完成。 – 2010-10-22 10:20:09

1

問題是,您阻止主線程,因此操作系統無法刷新窗口並顯示您的新視圖。 您可以嘗試在第二個線程中執行加載,或者,如果您需要調用大量非線程安全功能,則可以在短時間內通過NSTimer啓動加載,以便操作系統有時間刷新窗口。

另一種方法是執行加載viewDidAppear:,當視圖從nib文件加載時,視圖顯示時調用viewDidLoad,而視圖被調用。

+0

與'viewDidAppear'一樣的東西。 – 2010-10-22 10:09:30

+0

如果它在viewDidAppear中也不起作用,那麼您可能想嘗試一下timer方法嗎?所以你不需要在後臺加載,但你給操作系統時間刷新窗口。 – JustSid 2010-10-22 10:11:06