192 lines
5.5 KiB
Markdown
192 lines
5.5 KiB
Markdown
# 启动优化方案
|
|
|
|
## 🔍 发现的瓶颈
|
|
|
|
### 1. **TabbarController 一次性创建 4 个 ViewController**
|
|
```swift
|
|
// 现在的做法 - 启动时全部创建
|
|
let v1 = HomeViewController()
|
|
let v2 = MarketViewController()
|
|
let v3 = MessageViewController()
|
|
let v4 = MineViewController()
|
|
```
|
|
**问题**:每个 ViewController 都会在 viewDidLoad 中:
|
|
- 加载 UI
|
|
- 初始化主题系统
|
|
- 添加通知观察者
|
|
- 可能加载网络数据
|
|
|
|
### 2. **MktNavigationController 初始化开销**
|
|
- 每个 NavigationController 都要:
|
|
- 设置主题
|
|
- 添加手势识别器
|
|
- 配置导航栏外观
|
|
|
|
### 3. **主题系统初始化**
|
|
- ThemeManager 在每个 ViewController 中都要初始化
|
|
- 每个 ViewController 都要添加通知观察者
|
|
|
|
---
|
|
|
|
## ✅ 优化方案
|
|
|
|
### 方案 1:延迟加载 ViewController(推荐)
|
|
|
|
```swift
|
|
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 中延迟初始化主题:
|
|
|
|
```swift
|
|
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
|
|
|
|
移除不必要的初始化:
|
|
|
|
```swift
|
|
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 页面的切换
|
|
|
|
这样启动速度会明显提升!
|