В SwiftUI у меня есть List()
с именем и состоянием 3 задач:
import SwiftUI
struct ContentView: View {
let tasks = [TaskOne(), TaskTwo(), TaskThree()]
var body: some View {
List(tasks) { task in
Text(task.name)
Text(task.httpCode) // TODO
}
Button(action: { runTasks() }) {
Text("Run tasks")
}
}
private func runTasks() {
for task in tasks {
task.run()
// 1. Pass the output to the next task once finished
// 2. Update the status of the task in the List
}
}
}
Каждая задача выполняет запрос http, но может иметь собственную логику, и они должны быть отдельными:
protocol ExecutableTask {
var name: String { get set }
var httpCode: Int? { get set }
func execute(input: String) -> String
}
struct TaskOne: ExecutableTask {
var name = "one"
var httpCode: Int?
func execute(input: String) -> String {
// task specific logic here
// TODO: Perform HTTP call to "http://example.com/\(input)" and update httpCode in the List
return "first"
}
}
struct TaskTwo: ExecutableTask {
var name = "two"
var httpCode: Int?
func execute(input: String) -> String {
// task specific logic here
// TODO: Perform HTTP call to "http://example.com/\(input)" and update httpCode in the List
return "second"
}
}
struct TaskThree: ExecutableTask {
var name = "three"
var httpCode: Int?
func execute(input: String) -> String {
// task specific logic here
// TODO: Perform HTTP call to "http://example.com/\(input)" and update httpCode in the List
return "third"
}
}
Как я могу выполнить все последовательно в фоновом потоке, передавая выходные данные от одного к другому и обновляя статус в List
?
Я полагаю, мне нужно обновить каждую строку втаблицу с помощью @State
и выполнение задачи с помощью DispatchQueue
. Однако я не совсем уверен, как это сделать.