Task 是一个 Swift 类型,它用于执行异步操作

13 min read
struct Task<Output> {
    init(_ perform: (@escaping (Result<Output, Error>) -> Void) -> Void)
}

可以看到,Task 接受一个闭包作为参数,该闭包接受一个结果回调作为参数。

在执行异步操作时,可以使用这个回调来通知任务的执行结果。

您可以使用 Task 类型来执行任何异步操作,例如网络请求、文件 I/O 或复杂的计算。

下面是一个简单的例子,显示了如何使用 Task 执行一个网络请求:

struct MyView: View {
    @State private var result: String?

    var body: some View {
        Button("Fetch Data") {
            Task { completion in
                let url = URL(string: "https://example.com/data.json")!
                URLSession.shared.dataTask(with: url) { data, response, error in
                    if let error = error {
                        completion(.failure(error))
                    } else if let data = data {
                        do {
                            let json = try JSONSerialization.jsonObject(with: data, options: [])
                            completion(.success(json))
                        } catch {
                            completion(.failure(error))
                        }
                    }
                }.resume()
            }
            .receive(on: DispatchQueue.main)
            .sink(receiveCompletion: { _ in },
                  receiveValue: { self.result = "\($0)" })
        }
    }
}