后台线程中的SwiftUI串行DispatchQueue

后台线程中的SwiftUI串行DispatchQueue,swift,grand-central-dispatch,swift5,Swift,Grand Central Dispatch,Swift5,在SwiftUI中,我有一个列表(),其中包含3个任务的名称和状态: 导入快捷界面 结构ContentView:View{ 让tasks=[TaskOne()、TaskTwo()、TaskThree()] var body:一些观点{ 列表(任务){中的任务 文本(task.name) Text(task.httpCode)//TODO } 按钮(操作:{runTasks()}){ 文本(“运行任务”) } } 专用函数runTasks(){ 对于任务中的任务{ task.run() //1.完

在SwiftUI中,我有一个
列表()
,其中包含3个任务的名称和状态:

导入快捷界面
结构ContentView:View{
让tasks=[TaskOne()、TaskTwo()、TaskThree()]
var body:一些观点{
列表(任务){中的任务
文本(task.name)
Text(task.httpCode)//TODO
}
按钮(操作:{runTasks()}){
文本(“运行任务”)
}
}
专用函数runTasks(){
对于任务中的任务{
task.run()
//1.完成后将输出传递给下一个任务
//2.更新列表中任务的状态
}
}
}
每个任务不执行http请求,但可以具有自定义逻辑,并且它们需要分开:

协议可执行任务{
变量名称:字符串{get set}
var httpCode:Int?{get set}
func execute(输入:字符串)->字符串
}
结构TaskOne:可执行任务{
var name=“一”
var-httpCode:Int?
func execute(输入:字符串)->字符串{
//这里的任务特定逻辑
//TODO:对“”执行HTTP调用http://example.com/\(输入)“并更新列表中的httpCode
返回“第一”
}
}
结构任务二:可执行任务{
var name=“两个”
var-httpCode:Int?
func execute(输入:字符串)->字符串{
//这里的任务特定逻辑
//TODO:对“”执行HTTP调用http://example.com/\(输入)“并更新列表中的httpCode
返回“秒”
}
}
结构任务三:可执行任务{
var name=“三”
var-httpCode:Int?
func execute(输入:字符串)->字符串{
//这里的任务特定逻辑
//TODO:对“”执行HTTP调用http://example.com/\(输入)“并更新列表中的httpCode
返回“第三个”
}
}
如何在后台线程中串行地执行所有这些操作,将输出从一个线程传递到另一个线程,并更新
列表中的状态


我想我需要使用
@State
更新表中的每一行,并使用
DispatchQueue
执行任务。但是,我不完全确定如何做到这一点。

您可以使用“传统”方法-每个任务接受一个完成处理程序,然后从完成处理程序调用下一个任务。如果您使用的是SwiftUI,那么更“现代”的方法是使用
组合
,并创建执行工作的管道。无论哪种方法,您都不希望
@State
。您需要
ExecutableTask
成为
而不是
结构
,并符合
可观察对象
。然后,您可以将
@发布的var httpCode
绑定到列表行中的
$task.httpCode