在Swift中,withTaskGroup用于获取任务完成数据:

let test1 = await withTaskGroup { grp in
    grp.addTask { "Task 1 data" }
    grp.addTask { "Task 2 data" }
}
         
for await result in grp {
    print(result) // got task completed data
}

我们如何才能在withDiscardingTaskGroup年前完成任务的数据?

let test1 = await withDiscardingTaskGroup {grp in
    grp.addTask { "Task 1 data" }
    grp.addTask { "Task 2 data" }
}

推荐答案

DiscardingTaskGroup的全部分数是discard个子任务的结果.如果您希望从子任务中获得结果,请使用常规任务组.

如果子任务产生副作用,而不是返回值,则这很有用.这documentation人说:

这个[...]最适用于子任务的结果是某种形式的副作用的情况.

丢弃任务组类似于一堆Void类型的async let:

async let sideEffect1: Void = doSomethingAsync1()
async let sideEffect2: Void = doSomethingAsync2()
async let sideEffect3: Void = doSomethingAsync3()
await [sideEffect1, sideEffect2, sideEffect3]

当然,主要区别在于任务组可以具有动态数量的子任务.


附注:虽然丢弃了子任务的结果,但任务组仍然可以产生自己的结果,例如

let result = await withDiscardingTaskGroup(returning: Int.self) { group in
    // side effects...
    group.addTask { ... }
    group.addTask { ... }
    group.addTask { ... }

    // the group's own result
    return await getSomeIntegerAsynchronously()
}

getSomeIntegerAsynchronously不会等待子任务完成,而是与子任务并行运行.然而,在返回之前,will等待所有子任务,也有getSomeIntegerAsynchronously等待完成.

Swift相关问答推荐

VisionOS发送通知

我正在try 通过代码设置节中页眉和页脚的高度,但它不起作用

在NavigationStack上设置拐角半径:SwiftUI中的无响应内容视图区

在一行语句中比较Date.now的相等性是否安全

expose 不透明的底层类型

在SwiftUI中绘制形状的路径后填充形状

Xcode 15 Beta中如何使用@Observable?

如何从 Swift 中隐藏 Objective-C 类接口的一部分?

将 Encodable 扩展添加到 Swift 嵌套枚举

@Binding 在@StateObject 和 View 上被发布了两次?

从 actor 的 init 方法调用方法

为什么 id 不能通过 struct 从 Objective-C 移植到 Swift?

状态变量更改后,SwiftUI 视图不会更改

如何有条件地依赖桌面与 iOS 的系统库?

SwiftUI Grid 中的数组旋转

SwiftUI 4 列表初始化程序在 iOS 中不可用

如何以快速 Select 器菜单样式调整图像大小

.onTapGesture 不适用于 Stepper,仅适用于其文本

Swift 协议只能设置?

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?