为什么在呈现此模态视图时会出现延迟?

时间:2011-02-10 00:42:40

标签: iphone cocoa-touch delegates modalviewcontroller

我有一个应用程序,它以一个加载多个导航控制器的tableview(来自xib)开头。如果正在进行长初始化序列,我想在启动时呈现模态视图。我尝试在App Delegate中呈现模态视图,但直到底层代码已经完成之后才会出现视图。

MainWindow.xib加载了TableViewController,所以我将调用nowmodalview放在View Will Appear中,结果相同。我有很多NSLOG调用,所以我可以看到正在发生的事情,但我无法弄清楚为什么在app delegate和tableview控制器的viewWillAppear完成之后视图才会出现。我将调用移动到viewDidAppear,结果相同。这是一段代码:

App代表:

- (void)applicationDidFinishLaunching:(UIApplication *)application {

    // Add the tab bar controller's current view as a subview of the window
    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
    [[UIApplication sharedApplication] setStatusBarHidden:NO];

    // if new version being installed do init stuff
    if ( <needs update code here>) {
        Uncompress *uncompressView = [[Uncompress alloc] initWithNibName:@"Uncompress" bundle:nil];
        [self.tabBarController presentModalViewController:uncompressView animated:NO];
        [uncompressView release];
    }
}

我还尝试将presentmodalviewcontroller更改为[window addSubview:uncompressView.view]而没有任何运气。

更新代码运行得很好,问题是在AppDelegate和TableView完成之前视图才会出现。我不是以编程方式创建任何视图 - 所有视图都来自Xib。我无法弄清楚在何处调用更新功能以使视图立即显示。任何帮助赞赏。谢谢!

1 个答案:

答案 0 :(得分:2)

在iOS上,只有在代码将控制权返回到运行循环时才会更新UI。因此,如果您的解压缩任务需要花费很多时间,那么UI只会在完成后更新。

您可以通过将时间密集型任务放在单独的方法中并使用[self performSelector:... afterDelay:0.0 ...];调用该方法来解决此问题,但这不是一个好的解决方案,因为即使UI将更新,用户也可以与只要您的代码阻止主线程,您的应用仍将被阻止。如果您的代码运行时间超过几秒钟(例如,因为它在较旧的较慢设备上运行),则OS监视程序计时器将终止您的应用程序。

最好的解决方案是将时间密集型任务放在后台线程中,例如使用NSOperationdispatch_async()