在改善我的应用程序的性能时,我正在尝试减少加载和显示UIViewController所需的时间。我已经标记了我的每个方法来记录每个加载所需的时间(这是在旧的iPhone 4上完成的,以夸大时间)。
2013-07-03 15:50:32.546 MyApp[3047:907] init begin
2013-07-03 15:50:32.590 MyApp[3047:907] init end
2013-07-03 15:50:33.085 MyApp[3047:907] viewDidLoad begin
2013-07-03 15:50:33.194 MyApp[3047:907] viewDidLoad end
正如您所看到的,在init结束和viewDidLoad开始之间大概有0.5秒。根据我的理解,这是loadView发生的地方,但我根本就没有触及它。
我的问题是:减少加载时间的最佳做法是什么?我能以编程方式做什么,还是严格限制设备?
修改
一些代码:
MyViewController *myViewController = [[MyViewController alloc] init];
UINavigationController *myNavController = [[UINavigationController alloc] initWithRootViewController:myViewController];
myNavController.navigationBar.barStyle = UIBarStyleBlack;
[myNavController setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[self presentViewController:myNavController animated:YES completion:nil];
更多时间日志:
2013-07-03 21:07:26.813 MyApp[3612:907] begin presentViewController:animated:completion
2013-07-03 21:07:27.292 MyApp[3612:907] begin viewDidLoad
2013-07-03 21:07:27.401 MyApp[3612:907] finish viewDidLoad
2013-07-03 21:07:27.444 MyApp[3612:907] finish presentViewController:animated:completion
2013-07-03 21:07:27.508 MyApp[3612:907] begin loading tableView
2013-07-03 21:07:27.760 MyApp[3612:907] finish loading tableView
2013-07-03 21:07:28.513 MyApp[3612:907] viewDidAppear
我的视图控制器是从NIB加载的,包含一个tableView和一个UIDatePicker。 start presentViewController:animated:completion和begin viewDidLoad之间似乎有0.5秒的差距。由于我这里没有任何代码,我不知道在哪里或如何减少这个时间,或者甚至是可能的。
答案 0 :(得分:3)
记录输出会影响性能。没有那些日志输出语句,这可能会快得多。
但是,当您通过仪器时间分析器运行时,这是否是代码中最慢的区域?我怀疑。
描述您的代码并专注于首先提高最大瓶颈的性能。
答案 1 :(得分:0)
建议执行在后台线程上执行较长任务的任务,但请记住,在UIKit组件不是线程安全的情况下,需要在主线程上完成UI特定的操作。
例如,如果您在最初从Internet加载的图像视图上显示图像,则必须在后台线程上完成加载任务,并且一旦加载了图像的数据,就在主线程上渲染它。
上面提到的方法是视图控制器的生命周期,它使您可以灵活地定义在特定情况下可以实现的内容。例如,在init中,您可以初始化所有实例变量,在viewDidLoad上,您可以设置组件,还有另一种方法可以调用viewWillAppear,每当视图出现和消失时,设置和重置代理的位置,通知,观察员和其他人。
还有其他方法,如viewDidAppear,viewDidDisappear,viewDidUnload(不推荐使用iOS 6.0)和其他方法来处理视图控制器的生命周期事件,在其他状态下控制和管理视图控制器的状态。
答案 2 :(得分:0)
如果您要从大尺寸的互联网上加载图像,您可以使用延迟加载,这会将初始图像放到图像加载之前,这将有助于视图显示得更快。