V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
wseani
V2EX  ›  问与答

SwiftUI 的一个技术问题

  •  
  •   wseani · 2022-12-19 20:15:55 +08:00 · 710 次点击
    这是一个创建于 710 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我有一个需要加载数据的 Task ,想在 View 里显示进度条,但是目前 Task 并不会刷新进度条的值,该怎么做呢?

    目前的是

    struct ContentView: View {
       @ObservedObject var model: Model
    
        var body: some View {
            VStack {
                ProgressView("Downloading…", value: model.progress, total: 100)
                .onAppear {
                    Task {
                        await model.fetchData()
                    }
                }
            }
        }
    }
    
    
    
    //在 Model.swift 里,代码如下:
    @MainActor
    class Model: ObservableObject {
        @Published var progress: Int = 0
    
        func fetchData() async {
            Task {
                do {
                     for idx in 0...100 {
                        progress += 1
                        sleep(1)
                     }
                }
             }
        }
    }
    
    2 条回复    2022-12-20 15:27:09 +08:00
    hstdt
        1
    hstdt  
       2022-12-20 13:52:49 +08:00   ❤️ 1
    ```swift
    struct ContentView: View {
    @ObservedObject var model: Model = Model()
    var body: some View {
    VStack {
    ProgressView("Downloading…", value: model.progress, total: 100)
    .onAppear {
    Task {
    await model.fetchData()
    }
    }
    }
    }
    }

    class Model: ObservableObject {
    @Published var progress: Double = 0
    func fetchData() async {
    for _ in 0...100 {
    await MainActor.run { // 加上 onChange 之后会提示 Publishing changes from background threads is not allowed;
    progress += 1
    }
    sleep(1)
    }
    }
    }
    ```
    wseani
        2
    wseani  
    OP
       2022-12-20 15:27:09 +08:00
    @hstdt 多谢,我用类似的方式解决了,代码如下:
    ```lang-swift
    @MainActor
    class Model: ObservableObject {
    @Published var progress: Int = 0

    func fetchData() async {
    for idx in 0...100 {
    await load_data(idx)
    progress += 1
    }
    }

    func load_data() async {
    // 加载大文件数据
    }
    }
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3150 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 14:32 · PVG 22:32 · LAX 06:32 · JFK 09:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.