在 viewDidLoad 中同步請求網絡數據會阻塞主線程,導致:
- (void)viewDidLoad {
[super viewDidLoad];
self.completeList = [NSMutableArray array];
// 1. 立即顯示空狀態或加載指示器
[self showLoadingIndicator];
// 2. 後台線程請求數據
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSArray *remoteData = [self fetchListFromWebServices];
// 3. 主線程更新 UI
dispatch_async(dispatch_get_main_queue(), ^{
self.completeList = [NSMutableArray arrayWithArray:remoteData];
[self.tableView reloadData];
[self hideLoadingIndicator];
// 4. 空數據友好提示
if (self.completeList.count == 0) {
[self showEmptyStateView];
}
});
});
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat offsetY = scrollView.contentOffset.y;
CGFloat contentH = scrollView.contentSize.height;
CGFloat frameH = scrollView.frame.size.height;
if (offsetY > contentH - frameH * 1.5 && !self.isLoadingMore) {
[self loadNextPage];
}
}
使用 estimatedRowHeight + 自動佈局,避免 heightForRowAtIndexPath 重複計算導致卡頓。
| 指標 | 目標值 | 優化手段 |
|---|---|---|
| 首屏渲染時間 | < 300ms | 異步加載 + 骨架屏 |
| 列表滾動幀率 | 60fps | Cell 復用 + 異步佈局 |
| 弱網成功率 | > 99% | 超時重試 + 斷點續傳 |