2012-07-12 53 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 
    }); 
});