SwiftUI serial DispatchQueue в фоновом потоке - PullRequest
0 голосов
/ 06 октября 2019

В 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. Однако я не совсем уверен, как это сделать.

...