Files
2026-04-21 14:58:48 +08:00

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 时才创建其他页面
  • 用户感知不到延迟
  • 内存占用更低

实施步骤

  1. 修改 TabbarController 实现延迟加载
  2. 添加 UITabBarControllerDelegate
  3. 在 didSelect 中创建对应的 ViewController
  4. 测试各个 TabBar 页面的切换

这样启动速度会明显提升!