首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SwiftUI LazyVStack与UITableView CPU的使用

SwiftUI LazyVStack与UITableView CPU的使用
EN

Stack Overflow用户
提问于 2021-04-10 22:51:32
回答 1查看 463关注 0票数 1

我有两个相同的计划。一个是用SwiftUI写的,另一个是用UIKit写的。但是,当UIKit消耗5%的CPU时,SwiftUI消耗26%的CPU。有人知道我如何减少SwiftUI使用的CPU吗?

我最初的问题是列表和UITableView。但我发现LazyVStack比List高效得多,这要归功于@Paulw11 11。但它仍然远远落后于UITableView。

代码语言:javascript
复制
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)
        })
    }
}
代码语言:javascript
复制
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
    }
}

UITableView项目照片

SwiftUI项目照片

下载示例项目

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-07 10:52:48

@hyouuu最重要的部分是进步价值。避免在ViewModel中尽可能使用@已发布的值。相反,将视图拆分为子视图,并像示例中一样手动为ViewModel设置一个值。

代码语言:javascript
复制
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
            }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67039972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档