[英]SwiftUI List update take high CPU usage
我正在開發一個應用程序,它有一個小視圖來顯示下載/上傳項目的進度。 我使用 SwiftUI 列表來顯示它們,傳輸行將每 300 毫秒更新一次進度。
我遇到的問題是,當列表增長到10000行時,我每在列表的一行上更改一點,CPU 就會以高使用率運行。
我的 Xcode 版本是 13.3.1 (13E500a),模擬器 15.4 iOS。
我已經檢查了這個鏈接的解決方案
https://www.hackingwithswift.com/articles/210/how-to-fix-slow-list-updates-in-swiftui
此解決方案不適用於我的情況,我遇到的是刷新列表(20k 行)占用高 CPU 使用率。 (模擬器上超過 100%)
這是測試代碼
import SwiftUI
struct ContentView: View {
@StateObject var vm = viewModel()
@State var items = Array(1...20000)
var body: some View {
VStack {
List(){
Text(vm.itemUpdate)
ForEach(items, id: \.self ) {
Text("Item \($0)")
}
}
// .id(UUID())
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class viewModel: ObservableObject {
@Published var itemUpdate: String = ""
init() {
activeRefresh(interval: refreshInterval)
}
//Simulator data update every 200ms
private var refreshTimer: Timer?
private let refreshInterval:Double = 0.2
private func activeRefresh(interval :Double) {
refreshTimer = Timer.scheduledTimer(withTimeInterval: refreshInterval, repeats: true) {_ in
self.itemUpdate = "Dynamic Item \(Int.random(in: 20000..<20100) )"
}
}
}
使用視圖模型對象和使用id:\.self
通常是大錯誤。
嘗試將計時器移動到 View 結構中的@State
並將字符串格式化代碼移動到body
中的Text
中。 然后,您可以刪除該對象。
您還必須修復ForEach
,靜態整數數組的正確語法是ForEach(0..<1000)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.