Swift 5:如何解决NSManagedObjectContext perform的非Sendable警告?
解决Swift 5中NSManagedObjectContext.perform的Sendable警告
警告原因
该警告来自Swift的并发安全机制:传递给perform的异步闭包属于非Sendable类型,存在数据竞争风险,Swift 6会将此直接判定为错误。
解决方法
显式将闭包标注为@Sendable,明确告知编译器该闭包符合并发安全要求,同时保证闭包内的错误能正确向上抛出。
修改后的代码示例
import CoreData class Model{ func foo() async throws { let ctx = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType) // ... 其他上下文配置逻辑 try await ctx.perform { @Sendable () throws -> Void in if ctx.hasChanges { try ctx.save() } } } }
补充说明
使用.privateQueueConcurrencyType的Core Data上下文本身已保证线程安全,添加@Sendable标注只是满足Swift并发检查的规则。如果项目开启了Strict Concurrency Checking(严格并发检查),这类标注是必须的,也是适配Swift 6的必要操作。
内容的提问来源于stack exchange,提问作者john07
相关产品推荐
相关产品推荐

