我\xe2\x80\x99m 正在学习Swift async、await、 。@MainActor
我想运行一个很长的过程并显示进度。
\nimport 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) 我想单击 SwiftUI 中的一个按钮来触发 JSON 编码操作。此操作非常耗时,因此我需要它是异步的。我已经尝试了两种解决方案,但它们不起作用。一个主要问题是如何创建异步版本的 json 编码?
\n解决方案1)
\npublic 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)