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
相关产品推荐
相关产品推荐

