为什么简单的模态视图控制器在呈现和解除时会滞后?

时间:2013-06-03 17:50:55

标签: ios objective-c multithreading delegates modalviewcontroller

我的应用程序的主视图是UIImagePickerController摄像头视图。 当应用程序变为活动状态时(在didBecomeActive中),我提供了一个模态视图控制器,它显示了从网络请求生成的一些设置。 (请注意,出于调试目的,我将网络请求取出,目前只显示虚拟视图)

模态视图平滑动画,但加载后冻结3秒,然后正常响应。在关闭视图(也平滑动画)后,我的图像选取器控制器暂停2秒然后恢复正常。

我已从模态视图控制器中删除了所有功能,以确保没有操作阻塞主线程。我提出了最基本的控制器,仍然得到了波动的ui。我怀疑这是来自我的呈现视图控制器调用viewDidLoad / Unload或类似的东西,但我的搜索没有给出任何关于在显示模态视图时在呈现视图控制器中调用委托方法的信息。

我的问题可以通过回答来解决:

  • 显示模式视图时,演示者中调用了哪些委托方法?
  • (如果有的话)我怎么能不调用这些方法,或让它们运行得更顺畅?
  • 模态视图控制器有哪些常见的陷阱?

3 个答案:

答案 0 :(得分:2)

这可能是因为你在主线程中进行了大量处理(通常在UI停止时,这是因为主线程处理)。尝试为我们提供一些代码,特别是您认为最重的处理代码!抱歉我的英语不好:P! 尝试使用

将最重的代码调度到另一个线程
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    //your heavy code here =)
});

此致 卢卡斯

答案 1 :(得分:1)

调用了多个方法。 ViewDidLoad ViewWillAppear ViewDidAppear ViewWillDisappear ViewDidDisappear。检查所有这些方法。此外,检查您创建的任何子视图,看看他们是否正在他们的线程上做任何涉及我所述方法中的图像加载的事情。这也发生在模拟器和测试设备中吗?

ModalViewControllers没有太多陷阱,但是要了解在导航堆栈等内容上分配了多少视图以及彼此之间有多少视图。当你摆脱模态viewcontroller时,你调用dismissviewcontroller吗?

答案 2 :(得分:0)

可能导致一些轻微延迟的一件事是每次从头开始重新加载相同的viewController。

BProfileTableViewController * _profileViewController = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:profileViewController];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

您可以在此处看到,如果这是在tableView上,则每次应用程序需要再次创建viewController时单击。相反,如果我们只是重用视图,那么它就会摆脱一些延迟。

在头文件中添加

BProfileTableViewController * _profileView;

然后模态视图加载代码变为:

// Open the users profile
if (!_profileView) {
    _profileView = [[UIStoryboard storyboardWithName:@"Profile" bundle:[NSBundle chatUIBundle]] instantiateInitialViewController];
}

UINavigationController * profileNavigationController = [[UINavigationController alloc] initWithRootViewController:_profileView];
[self.navigationController presentViewController:profileNavigationController animated:YES completion:nil];

这意味着我们只是重新加载视图而不是重新创建视图

相关问题