相关疑难解决方法(0)

使用 Swift async、await、@MainActor 的后台任务的最佳解决方案是什么

我\xe2\x80\x99m 正在学习Swift asyncawait、 。@MainActor

\n

我想运行一个很长的过程并显示进度。

\n
import SwiftUI\n\n@MainActor\nfinal class ViewModel: ObservableObject {\n    @Published var count = 0\n\n    func countUpAsync() async {\n        print("countUpAsync() isMain=\\(Thread.isMainThread)")\n        for _ in 0..<5 {\n            count += 1\n            Thread.sleep(forTimeInterval: 0.5)\n        }\n    }\n\n    func countUp() {\n        print("countUp() isMain=\\(Thread.isMainThread)")\n        for _ in 0..<5 {\n            self.count += 1\n            Thread.sleep(forTimeInterval: 0.5)\n        }\n    }\n}\n\nstruct ContentView: View {\n    @StateObject private var viewModel = ViewModel()\n\n    var body: some View {\n        VStack {\n            Text("Count=\\(viewModel.count)")\n                .font(.title)\n\n            Button("Start Dispatch") {\n                DispatchQueue.global().async {\n …
Run Code Online (Sandbox Code Playgroud)

asynchronous async-await swift mainactor

8
推荐指数
1
解决办法
9404
查看次数

如何使用 SwiftUI 按钮执行异步操作

我想单击 SwiftUI 中的一个按钮来触发 JSON 编码操作。此操作非常耗时,因此我需要它是异步的。我已经尝试了两种解决方案,但它们不起作用。一个主要问题是如何创建异步版本的 json 编码?

\n

解决方案1)

\n
public func encodeJSON<T>(_ value: T, encoder: JSONEncoder, completionHandler: @escaping (Data?, Error?) -> Void) where T: Encodable {\n        DispatchQueue.global().async {\n            do {\n                let data = try encoder.encode(value)\n                DispatchQueue.main.async {\n                    completionHandler(data, nil)\n                    print("finish encode json")\n                }\n            } catch {\n                DispatchQueue.main.async {\n                    completionHandler(nil, error)\n                    print("fail encode json")\n                }\n            }\n        }\n    }\n    \n    public func encodeJSON<T>(_ value: T, encoder: JSONEncoder) async throws -> Data where T: Encodable {\n        \n        try await withUnsafeThrowingContinuation { continuation …
Run Code Online (Sandbox Code Playgroud)

button async-await swift swiftui swift-concurrency

7
推荐指数
1
解决办法
7384
查看次数