项目初始化
This commit is contained in:
@@ -0,0 +1,191 @@
|
||||
# 启动优化方案
|
||||
|
||||
## 🔍 发现的瓶颈
|
||||
|
||||
### 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 页面的切换
|
||||
|
||||
这样启动速度会明显提升!
|
||||
Reference in New Issue
Block a user