我有两个相同的计划。一个是用SwiftUI写的,另一个是用UIKit写的。但是,当UIKit消耗5%的CPU时,SwiftUI消耗26%的CPU。有人知道我如何减少SwiftUI使用的CPU吗?
我最初的问题是列表和UITableView。但我发现LazyVStack比List高效得多,这要归功于@Paulw11 11。但它仍然远远落后于UITableView。
import SwiftUI
struct ContentView: View {
@State private var progress: Double = 0.0
var body: some View {
VStack {
ScrollView {
LazyVStack {
ForEach(1...1000, id: \.self) { value in
Text("Hello, world!")
}
}
}
Slider(value: $progress, in: 0.0...1.0, step: 0.01)
}
.onChange(of: progress, perform: { value in
print(value)
})
}
}import UIKit
final class ViewController: UIViewController {
private let array: Array<String> = Array(repeating: "Hello, world!", count: 1000)
@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var slider: UISlider!
@IBAction func sliderChanged(_ sender: UISlider) {
print(sender.value)
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
array.count[enter image description here][1]
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
cell.textLabel?.text = array[indexPath.row]
return cell
}
}发布于 2022-11-07 10:52:48
@hyouuu最重要的部分是进步价值。避免在ViewModel中尽可能使用@已发布的值。相反,将视图拆分为子视图,并像示例中一样手动为ViewModel设置一个值。
import SwiftUI
import Combine
final class ViewModel: ObservableObject {
var array = Array(1...1000)
var text = "Hello, world!"
var progress: Double = 0.0 {
didSet {
print("new value",progress)
}
}
}
struct ContentView: View {
@StateObject var viewModel = ViewModel()
var body: some View {
VStack {
Scroll(viewModel: viewModel)
Slide(viewModel: viewModel)
}
}
}
struct Scroll: View {
@StateObject var viewModel: ViewModel
var body: some View {
List {
ForEach(viewModel.array, id: \.self) { value in Text(viewModel.text) }
}
}
}
struct Slide: View {
@StateObject var viewModel: ViewModel
@State var progress:Double = 0.0
var body: some View {
Slider(value: $progress, in: 0.0...1.0, step: 0.01)
.onChange(of: progress) { newValue in
viewModel.progress = newValue
}
}
}https://stackoverflow.com/questions/67039972
复制相似问题