Xcode报错:Call to main actor-isolated static method ‘save’ in a synchronous nonisolated context
Xcode报错:Call to main actor-isolated static method ‘save’ in a synchronous nonisolated context

Xcode报错:Call to main actor-isolated static method ‘save’ in a synchronous nonisolated context

Swift代码:

provider.loadFileRepresentation(forTypeIdentifier: UTType.image.identifier) { url, error in
    defer { group.leave() }
    guard let fileURL = url,
            let imageURL = FileUtils.saveURLToTempFile(fileURL: fileURL) else { return }
    imageURLs.append(imageURL)
}

Xcode 中的 guard let fileURL一行,显示以下提示:

Call to main actor-isolated static method 'saveURLToTempFile(fileURL:)' in a synchronous nonisolated context; this is an error in the Swift 6 language mode

这个是 Actor隔离(MainActor隔离)冲突问题。Swift 6 对并发检查严格,在后台调用 MainActor 隔离的方法会被视为错误。

Swift代码中的 provider.loadFileRepresentation 闭包是在非 MainActor 线程执行的,而内部调用的 FileUtils.saveURLToTempFile 是 MainActor-isolated 方法,两者的隔离不一致。

解决方案:

provider.loadFileRepresentation(forTypeIdentifier: UTType.image.identifier) { url, error in
    defer { group.leave() }
    Task { @MainActor in
        guard let fileURL = url,
              let imageURL = FileUtils.saveURLToTempFile(fileURL: fileURL) else { return }
        imageURLs.append(imageURL)
    }
}

当方法涉及主线程执行时,使用Task { @MainActor in … } 包裹。

这样可以保证线程安全。

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注