2012-07-12 55 views
0

我有一個表視圖,當用戶選擇一行時,我將它們推送到一個新的ViewController。起初,我初始化ViewDidLoad方法中的所有視圖對象(涉及Web服務調用),但是我發現它使我的tableview過渡到新的viewcontroller很長時間。ios UI在viewdidar中無響應

相反,我移動了ViewDidAppear方法中的大部分UI初始化,我喜歡它加快了從tableview到新viewcontroller的轉換。

但是,我不能在屏幕頂部的NavigationBar中按任何按鈕(如後退按鈕),直到我的ViewDidAppear方法完成並加載UI。

這是什麼解決方案?有沒有另一種方式來加載我的用戶界面,而不阻止用戶與我的NavigationBar中的按鈕進行交互?

謝謝!

+0

你試圖做viewWillAppear中初始化? – 2012-07-12 05:19:16

+0

是的,我試過了。它減慢了我從tableview到新的ViewController的轉換速度,我不喜歡它。我仍然希望平穩過渡。 – user1467188 2012-07-12 05:24:53

+0

你在主線上做得太多了。 – 2014-06-02 16:01:16

回答

-2

嘗試使用下面的方法

[self performSelectorInBackground:@selector(initYourUI) withObject:yourObj]; 

初始化在後臺您的UI可以在ViewDidLoad

+1

在後臺使用UI可能導致崩潰。所以這不是一個好的理念。 – Daniel 2014-06-02 15:29:54

0

調用這個你可以使用大中央調度,使您的Web服務調用異步,這將保持主線程的UI響應。

//create new queue 
dispatch_queue_t backgroundQueue = dispatch_queue_create("com.siteName.projectName.bgqueue", NULL); 

//run requests in background on new queue 
dispatch_async(backgroundQueue, ^{ 
    //insert web service requests here 
}); 

這裏有一個更深入的教程:

http://www.raywenderlich.com/4295/multithreading-and-grand-central-dispatch-on-ios-for-beginners-tutorial

+0

,這將讓他們在主線 - 我不認爲這就是你的意思 – 2014-06-02 15:59:44

+0

@ Daij-Djan你說得對,謝謝 - 現在應該修復 – 2014-06-03 12:43:47

+0

你泄漏,但基本的想法現在是正確的:) – 2014-06-03 14:00:06

0

你做的主線程太多。卸載你的更長的操作,如IO或更長的計算,但請注意不要在後臺線程中弄亂UI。

只觸摸主線程上的UI。 (有時注意它可能看起來安全的,但是從長遠來看,它總是最終產生怪異的問題)

一個簡單的方法是使用GCD:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ 
    //insert web service requests/computations/IO here 

    dispatch_async(dispatch_get_main_queue(),^{ 
     //back to the main thread for UI Work 
    }); 
});