You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift闭包报错:‘Sending 'onResultFetched' risks causing data races’求助

解决Swift闭包“'onResultFetched' risks causing data races”错误

这个错误是Swift严格并发检查(Strict Concurrency Checking)触发的,它检测到@escaping闭包的调用存在潜在数据竞争风险——通常是因为闭包没有明确的并发安全上下文,或跨线程传递时不符合Sendable协议要求。以下是几种可行的解决办法:

方案1:指定闭包在MainActor执行

你的代码是在主队列中调用闭包,显式标记闭包参数为@MainActor,确保它在主线程的Actor上下文执行:

func studentResult(rollNo: String, onResultFetched: @escaping @MainActor (Bool) -> Void) {
    print("Fetching result for Roll Number: \(rollNo)")
    DispatchQueue.main.asyncAfter(deadline: .now()+5) {
        onResultFetched(true)
    }
}

也可以直接标记整个函数为@MainActor,让函数内所有逻辑绑定主线程上下文:

@MainActor
func studentResult(rollNo: String, onResultFetched: @escaping (Bool) -> Void) {
    print("Fetching result for Roll Number: \(rollNo)")
    DispatchQueue.main.asyncAfter(deadline: .now()+5) {
        onResultFetched(true)
    }
}

方案2:让闭包符合Sendable协议

在Swift并发模型中,跨线程传递的闭包需要遵循Sendable协议,显式声明闭包为@Sendable:

func studentResult(rollNo: String, onResultFetched: @escaping @Sendable (Bool) -> Void) {
    print("Fetching result for Roll Number: \(rollNo)")
    DispatchQueue.main.asyncAfter(deadline: .now()+5) {
        onResultFetched(true)
    }
}

如果闭包捕获了外部变量,要确保这些变量同样是Sendable类型,或通过Actor隔离保证并发安全。

方案3:调整并发检查级别(临时方案)

如果暂时不想修改代码,可以降低严格并发检查的级别:

  • 打开项目Target → Build Settings,搜索“Strict Concurrency Checking”
  • 将值从“Complete”改为“Minimal”或“Targeted”

不推荐长期使用这个方法,建议优先通过代码修改保证并发安全。

为什么之前正常现在报错?

大概率是因为项目启用了更高等级的Strict Concurrency Checking(比如升级Xcode后默认配置变更,或手动调整了编译设置),Swift现在会更严格地校验并发安全问题。

内容的提问来源于stack exchange,提问作者M.Hasnain Bangash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 00:45:03