簡體   English   中英

SwiftUI 列表更新占用高 CPU 使用率

[英]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) )"
        }
    }
}


Xcode 運行高 CPU 100% 截圖

使用視圖模型對象和使用id:\.self通常是大錯誤。

嘗試將計時器移動到 View 結構中的@State並將字符串格式化代碼移動到body中的Text中。 然后,您可以刪除該對象。

您還必須修復ForEach ,靜態整數數組的正確語法是ForEach(0..<1000)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM