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 … } 包裹。
这样可以保证线程安全。
