Iphone 为什么在呈现这种模式视图时会出现延迟?

Iphone 为什么在呈现这种模式视图时会出现延迟?,iphone,cocoa-touch,delegates,modalviewcontroller,Iphone,Cocoa Touch,Delegates,Modalviewcontroller,我有一个以加载多个导航控制器的tableview(从xib)启动的应用程序。如果长的初始化序列正在进行中,我想在启动时提供一个模式视图。我尝试在App委托中呈现一个模式视图,但该视图直到底层代码完成后才出现 MainWindow.xib加载TableViewController,因此我调用presentmodalview,该视图将显示相同的结果。我有许多NSLOG调用,因此我可以观察正在发生的事情,但我不明白为什么视图在应用程序委托和tableview控制器的视图都显示完成后才显示。我将调用移动

我有一个以加载多个导航控制器的tableview(从xib)启动的应用程序。如果长的初始化序列正在进行中,我想在启动时提供一个模式视图。我尝试在App委托中呈现一个模式视图,但该视图直到底层代码完成后才出现

MainWindow.xib加载TableViewController,因此我调用presentmodalview,该视图将显示相同的结果。我有许多NSLOG调用,因此我可以观察正在发生的事情,但我不明白为什么视图在应用程序委托和tableview控制器的视图都显示完成后才显示。我将调用移动到viewDidAppear,结果相同。以下是一段代码片段:

应用程序代表:
-(void)applicationdFinishLaunching:(UIApplication*)应用程序{
//将选项卡栏控制器的当前视图添加为窗口的子视图
[窗口添加子视图:tabBarController.view];
[WindowMakeKeyandVisible];
[[UIApplication sharedApplication]setStatusBarHidden:否];
//如果安装了新版本,请执行初始化操作
如果(){
解压*解压视图=[[UncompressAlloc]initWithNibName:@“解压”包:nil];
[self.tabBarController presentModalViewController:uncompressView动画:否];
[解压视图发布];
}
}
我还尝试将
presentmodalviewcontroller
更改为
[窗口添加子视图:解压缩视图.视图]


更新代码运行正常,问题是在AppDelegate和TableView都完成之前,视图不会出现。我不是以编程方式创建任何视图-所有视图都来自Xib。我不知道在哪里调用update函数来立即显示视图。谢谢你的帮助。谢谢大家!

在iOS上,只有当代码将控制权返回到运行循环时,UI才会更新。因此,如果解压任务花费大量时间,UI将仅在完成后更新

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


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

解压中发生了什么,特别是它的初始值设定项和
viewDidLoad
?谢谢!因为我的代码不需要用户交互,所以我选择了
[self-performselector…]
路线。
- (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];
    }
}