5.5 KiB
5.5 KiB
启动优化方案
🔍 发现的瓶颈
1. TabbarController 一次性创建 4 个 ViewController
// 现在的做法 - 启动时全部创建
let v1 = HomeViewController()
let v2 = MarketViewController()
let v3 = MessageViewController()
let v4 = MineViewController()
问题:每个 ViewController 都会在 viewDidLoad 中:
- 加载 UI
- 初始化主题系统
- 添加通知观察者
- 可能加载网络数据
2. MktNavigationController 初始化开销
- 每个 NavigationController 都要:
- 设置主题
- 添加手势识别器
- 配置导航栏外观
3. 主题系统初始化
- ThemeManager 在每个 ViewController 中都要初始化
- 每个 ViewController 都要添加通知观察者
✅ 优化方案
方案 1:延迟加载 ViewController(推荐)
class TabbarController {
static let shared = TabbarController()
private init() {}
private var viewControllers: [UIViewController?] = [nil, nil, nil, nil]
func customBouncesStyle() -> ESTabBarController {
let tabBarController = ESTabBarController()
self.applyCurvedShadow(tabBarController.tabBar)
// 只创建第一个 ViewController
let v1 = HomeViewController()
let nav1 = MktNavigatonController(rootViewController: v1)
// 其他 ViewController 延迟创建
let nav2 = UINavigationController()
let nav3 = UINavigationController()
let nav4 = UINavigationController()
// 设置 TabBar 项
v1.tabBarItem = ESTabBarItem(BouncesView(), title: "首页",
image: UIImage(named: "tabbar_shouye_normal"),
selectedImage: UIImage(named: "tabbar_shouye_select"))
nav2.tabBarItem = ESTabBarItem(BouncesView(), title: "极速租",
image: UIImage(named: "tabbar_fenlei_normal"),
selectedImage: UIImage(named: "tabbar_fenlei_select"))
nav3.tabBarItem = ESTabBarItem(BouncesView(), title: "客服",
image: UIImage(named: "tabbar_kf_normal"),
selectedImage: UIImage(named: "tabbar_kf_select"))
nav4.tabBarItem = ESTabBarItem(BouncesView(), title: "我的",
image: UIImage(named: "tabbar_mine_normal"),
selectedImage: UIImage(named: "tabbar_mine_select"))
tabBarController.viewControllers = [nav1, nav2, nav3, nav4]
tabBarController.delegate = self
self.viewControllers[0] = v1
return tabBarController
}
// 当用户切换 TabBar 时才创建对应的 ViewController
func tabBarController(_ tabBarController: UITabBarController,
didSelect viewController: UIViewController) {
guard let navController = viewController as? UINavigationController else { return }
let index = tabBarController.selectedIndex
// 如果已经创建过,直接返回
if viewControllers[index] != nil {
return
}
// 延迟创建
let vc: UIViewController
switch index {
case 1:
vc = MarketViewController()
case 2:
vc = MessageViewController()
case 3:
vc = MineViewController()
default:
return
}
navController.viewControllers = [vc]
viewControllers[index] = vc
}
}
extension TabbarController: UITabBarControllerDelegate {
// 实现 delegate 方法
}
方案 2:异步初始化主题
在 AppDelegate 中延迟初始化主题:
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
self.window = UIWindow(frame: UIScreen.main.bounds)
self.window?.rootViewController = TabbarController.shared.customBouncesStyle()
self.window?.makeKeyAndVisible()
// 延迟初始化主题(不阻塞启动)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
_ = ThemeManager.shared
}
return true
}
方案 3:优化 MktNavigationController
移除不必要的初始化:
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = .white
self.navigationBar.isHidden = self.isHidden
// ... 其他代码 ...
// 延迟设置主题(不阻塞启动)
DispatchQueue.main.asyncAfter(deadline: .now() + 0.05) {
self.setupTheme()
NotificationCenter.default.addObserver(
self,
selector: #selector(self.themeDidChange),
name: NSNotification.Name("ThemeDidChangeNotification"),
object: nil
)
}
}
📊 优化效果预期
| 优化项 | 启动时间减少 |
|---|---|
| 延迟加载 ViewController | 60-70% |
| 异步初始化主题 | 10-15% |
| 优化 NavigationController | 5-10% |
| 总体 | 70-80% |
🎯 推荐方案
使用方案 1(延迟加载) 效果最好,因为:
- ✅ 启动时只创建首页
- ✅ 用户切换 TabBar 时才创建其他页面
- ✅ 用户感知不到延迟
- ✅ 内存占用更低
实施步骤
- 修改 TabbarController 实现延迟加载
- 添加 UITabBarControllerDelegate
- 在 didSelect 中创建对应的 ViewController
- 测试各个 TabBar 页面的切换
这样启动速度会明显提升!