如何终止所有Live Activities?执行代码后活动仍未消失
解决Live Activities无法全部终止的问题
你的代码问题出在两个核心点:
Activity<MyAttributes>.activities是动态集合,遍历过程中集合可能因活动状态变化发生变动,导致部分活动被遗漏- 每个
activity.end放在独立Task里异步执行,程序不会等待所有终止操作完成就继续,部分活动的终止请求可能没被正确处理
修正方案一:先快照所有活动再串行终止
先把当前活动集合快照到数组,避免遍历过程中集合动态变化,再逐个串行执行终止操作:
// 先获取当前所有活动的快照,固定遍历范围 let currentActivities = Activity<MyAttributes>.activities for activity in currentActivities { await activity.end(nil, dismissalPolicy: .immediate) }
修正方案二:用TaskGroup确保所有操作完成
通过TaskGroup管理所有终止任务,确保每个活动的终止请求都执行完毕:
await withTaskGroup(of: Void.self) { group in // 同样先快照活动集合,避免遍历中集合变动 for activity in Activity<MyAttributes>.activities { group.addTask { await activity.end(nil, dismissalPolicy: .immediate) } } // 自动等待所有任务执行完成 }
额外排查点:如果仍有活动残留,检查是否存在属性类型不匹配MyAttributes的活动,这类活动需要对应类型的Activity实例来获取和终止。
内容的提问来源于stack exchange,提问作者Sergio
相关产品推荐
相关产品推荐

