問題現象
SwiftUI中,若List中包含大量數據,當更新數據時界面會發生嚴重卡頓。
前兩張圖分別演示了在2k條數據下,未優化時需要8.29秒,而優化後只需要0.07秒,相差有118倍之多。
後兩張圖演示了在2w和10w條數據下,優化後的表現。可以看到即使數據達到10w條,更新也不會超過1秒鐘,可謂相當驚人。
問題分析
1. List數據變化時List如何刷新?
SwiftUI中使用的是“差異”比較的方式來刷新界面。
因爲SwiftUI是以狀態驅動的,所有的數據更新都會自動觸發UI的刷新。
在List內部的數據發生變化時,SwiftUI會嘗試區分數據更新之前和之後的差異,確定差異部分後,會將更改後的行移動到新的位置, 從而完成界面的刷新。
這是一