0

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

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

但是,在 ViewDidAppear 方法完成并加载 UI 之前,我无法按下屏幕顶部 NavigationBar 中的任何按钮(如后退按钮)。

解决方案是什么?是否有另一种方法可以让我加载我的 UI 而不会阻止用户与我的 NavigationBar 中的按钮进行交互?

谢谢!!

4

3 回答 3

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

于 2014-06-02T15:55:49.030 回答
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
    });
});
于 2014-06-02T16:05:20.327 回答
-2

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

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

您可以在ViewDidLoad

于 2012-07-12T05:28:15.260 回答