为啥在呈现这个模态视图时会有延迟?

Posted

技术标签:

【中文标题】为啥在呈现这个模态视图时会有延迟?【英文标题】:Why is there a delay when presenting this modal view?为什么在呈现这个模态视图时会有延迟? 【发布时间】:2011-02-10 00:42:39 【问题描述】:

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

MainWindow.xib 加载 TableViewController,所以我在该视图中调用 presentmodalview 会出现相同的结果。我有很多 NSLOG 调用,所以我可以观察正在发生的事情,但我无法弄清楚为什么视图在应用程序委托和 tableview 控制器的 viewWillAppear 完成之后才会出现。我将调用移至 viewDidAppear,结果相同。这是一个代码sn-p:

应用代理:

- (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。我不知道在哪里调用更新函数来让视图立即出现。任何帮助表示赞赏。谢谢!

【问题讨论】:

Uncompress 中发生了什么,特别是它的初始化程序和viewDidLoad 【参考方案1】:

ios 上,UI 仅在您的代码将控制权返回给运行循环时才会更新。因此,如果您的解压缩任务需要很长时间,则 UI 只会在完成后更新。

您可以通过将耗时的任务放在单独的方法中并使用 [self performSelector:... afterDelay:0.0 ...]; 调用该方法来解决此问题,但这不是一个好的解决方案,因为即使 UI 将更新,用户与您的应用程序的交互只要您的代码阻塞主线程,它仍然会被阻塞。如果您的代码运行时间超过几秒钟(例如,因为它在较旧、速度较慢的设备上运行),操作系统看门狗计时器将终止您的应用。

最好的解决方案是将耗时的任务放在后台线程中,例如NSOperationdispatch_async()

【讨论】:

谢谢!我选择了[self performselector...] 路线,因为我的代码不需要用户交互。

以上是关于为啥在呈现这个模态视图时会有延迟?的主要内容,如果未能解决你的问题,请参考以下文章

呈现模态视图控制器的延迟

为啥直播推文时会有延迟?

为啥一个简单的模态视图控制器在呈现和关闭时会滞后?

UIVisualEffectView 延迟与 UIModalTransitionStyle CrossDissolve

关闭模态视图控制器后呈现不同的视图控制器

为啥在使用`with`时会延迟`not deferable`约束?