缓慢的 UIViewController 加载时间(缓慢的 ClientState 警告)

Posted

技术标签:

【中文标题】缓慢的 UIViewController 加载时间(缓慢的 ClientState 警告)【英文标题】:Slow UIViewController load time (slow ClientState warning) 【发布时间】:2013-01-13 03:26:13 【问题描述】:

自从我将旧应用程序转换为 ios 6 后,我的控制台中开始出现以下消息。

WARNING: Slow defaults access for key ClientState took 0.023656 seconds, tolerance is 0.020000

除了将我的代码从 iOS 5 更新到 iOS 6 之外,我还切换到了自动布局。我已经运行了 Instruments/Time Profiler,而我的 appDelegate 中的 rootViewController 是问题所在。每次我切换视图控制器时,它都会占用大部分时间,(无论我是否必须实例化视图控制器或重新使用已经存在的视图控制器)。

window.rootViewController = myViewController;

我知道该方法表面上做了什么,但我不确定在幕后会发生什么......现在什么会导致它变慢,我可以做些什么来加快它的速度?

编辑:我尝试将我的情节提要关闭自动布局并且问题消失了(当然我的 UI 布局一团糟)。所以显而易见的结论是,它是关于自动布局的。我可能在屏幕上组合了不到 70 个视图,以及布置它们所需的各种约束。我很难相信自动布局会慢得多(从关闭自动布局的 ~80ms 到打开自动布局的 ~1370ms)。

【问题讨论】:

奇怪的警告以前从未见过,但你使用 Core Data 吗? 不。只有一个故事板上的几个相当复杂的视图控制器和一些我序列化的数据对象类。由于在应用程序运行的整个过程中,所有数据(并不多)都需要保留在内存中,Core Data 似乎有点过头了。 Slow defaults access for key ClientState warning on iOS的可能重复 @Peter 可能是,但它没有真正的答案,所以我想我会尝试更具体的问题细节。 【参考方案1】:

在屏幕上获得 70 次观看听起来很多!我的建议是以某种方式让它更简单

您真的需要同时查看所有 70 个视图吗?

检查是否所有视图都需要自动布局,尽可能将其删除

可以用图形替换某些视图吗?我使用过视图,例如对于阴影,可能是图像

你能把storyBoard分成几个小的吗?一个用于登录、详细信息、编辑模式等。部分缓慢可能来自系统必须处理(太)大故事板。

【讨论】:

70 次观看并非微不足道,但也不是很大。考虑一个表格单元格。您有一个背景视图、一个内容视图、一个图像视图、一个标签视图、一个显示视图(可能更多),而这只是默认单元格。在标准单元格高度,同时呈现 10 个 + 表格视图、导航栏、标题和按钮。对于一个非常常见的 UI,您的浏览量已接近 60 次。自动布局也是基于故事板的。我无法删除每个视图的自动布局,我真的很想使用它,因为它显着简化了我的代码(必须删除很多 setFrame 代码)。【参考方案2】:

考虑创建一个带有 2 个视图控制器的新项目并测试切换速度。每个 iOS 应用程序都有一个窗口、一个根视图控制器和一个视图控制器。问题可能不像您希望的那样狭窄和明确。每个视图控制器加载什么?你检查过底层代码吗?应用代理是否对根视图控制器的初始化或更改做任何事情?

【讨论】:

当你说“检查底层代码”时,你能解释一下底层代码是什么吗?虽然我知道一些从窗口中删除旧视图结构、添加新视图结构、为这些结构运行各种方法的明显位......这些方法都不会花费大量时间。对于代码变慢,被调用的方法除了实例化视图控制器(如果它不存在)并设置rootViewController之外什么都不做。

以上是关于缓慢的 UIViewController 加载时间(缓慢的 ClientState 警告)的主要内容,如果未能解决你的问题,请参考以下文章

从核心数据到表的数据加载非常缓慢

AdMob + 内容显示缓慢 + Google DFP

图片加载时间缓慢问题API

Firebug net tab 报告的页面接收时间长(页面加载缓慢)

UIcollectionView 具有缓慢的图像加载和滚动

图像加载导致 OpenGL 中的处理缓慢