在viewdidappear期间ios UI无响应

时间:2012-07-12 05:13:00

标签: ios xcode viewdidappear

我有一个表视图,当用户选择一行时,我将它们推送到一个新的ViewController。首先,我在ViewDidLoad方法中初始化了所有视图对象(涉及Web服务调用),但我看到它从我的tableview转换到我的新viewcontroller很长时间。

相反,我在ViewDidAppear方法中移动了大部分UI初始化,我喜欢它加快了从tableview到新viewcontroller的过渡。

但是,我无法按下屏幕顶部导航栏中的任何按钮(如后退按钮),直到我的ViewDidAppear方法完成并加载了UI。

这是什么解决方案?有没有其他方法可以加载我的UI而不会阻止用户与我的NavigationBar中的按钮进行交互?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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
    });
});

答案 2 :(得分:-2)

尝试使用以下方法在后台初始化您的UI

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

您可以在ViewDidLoad

中调用此方法