Tencent / QMUI_iOS

QMUI iOS——致力于提高项目 UI 开发效率的解决方案
http://qmuiteam.com/ios
Other
7.1k stars 1.39k forks source link

全局UI配置表功能建议 #685

Closed casscqt closed 4 years ago

casscqt commented 5 years ago

一、现存问题: 当前没有使用ConfigurationTemplate配置表功能时,applyInitialTemplate也进行了所有文件遍历。如果业务在类文件load函数中进行UI对象创建,则会触发_dyld_start阶段的时间消耗。

在iPhone6s Plus 70ms+,工程文件多会消耗多一些。

image

二、建议:

如果业务没有进行全局 UI 配置表功能,是否可以有开关进行关闭。减少不必要的消耗,虽然只有几十毫秒,但是对于启动的优化时间都是一点点抠出来的。是否可以对全局UI配置表功能有一个功能开关,如果没有使用到该功能可以进行关闭?

MoLice commented 4 years ago

QMUIConfiguration.m 里的 applyInitialTemplate 耗时主要是在寻找配置表的操作上,因为支持多份配置表,因此需要拿到所有的 class 再用特定规则去遍历查找匹配的 class。之前通过 runtime 提供的 objc_getClassList() 获取整个 App 里所有 class(包含系统库和链接的第三方库),这个操作在 QD 这种量级的应用(两万多个 class)里大概耗时 0.04s,在 WeRead 这种量级的应用(三万多个 class)里大概 0.1s,在这个 https://github.com/Tencent/QMUI_iOS/commit/c53f0a97c224d757fe08d1f425990cf52688a075 里,我们将其改为从 Mach-O 的 (DATA, objc_classlist) 里读取当前应用的 class,不包含系统库和第三方库,所以速度得到明显提升,目前的耗时保持在 0.00x 秒级别,可以忽略不计,而整个 applyInitialTemplate 方法的耗时也在 0.02s 左右,希望这个提升能满足你的诉求。目前这个提交尚未带到版本里,如果你希望体验,可以将项目的 Podfile 里对 QMUI 的引用改为下面这样,即可拉取最新代码:

pod 'QMUIKit', :git => 'https://github.com/Tencent/QMUI_iOS.git'

至于你提的开关,其实既然你希望把配置表关闭,那你可以把配置表从项目里去除,配置表在 QMUI 框架里不是必须的,去掉之后,applyInitialTemplate 也就不耗时了。