У меня есть представление, которое позволяет пользователю выбрать изображение. Я привязываю PhotoPicker к «элементу» PhotoPickerItem. Но в функции «getImage» я получаю сообщение об ошибке: «Отправка «photoPickerItem.some» может привести к гонкам данных».
Я думаю, проблема здесь в том, что PhotoPickerItem не является отправкой. Но как мне решить эту проблему? Ждете, пока Apple разрешит Photopickeritem соответствовать Sendable?
@MainActor
struct EditableImage: View {
var selectedImageUrl: Binding<String?>
var imageType: ImageType
@State var placeHolderImage: String?
@State private var item: PhotosPickerItem?
@State private var image: Image?
@State private var isUploadingImage: Bool = false
private func getImage(by photoPickerItem: PhotosPickerItem?) async {
// ERROR HERE: Sending 'photoPickerItem.some' risks causing data races
if let data = try? await photoPickerItem?.loadTransferable(type: Data.self) {
if let uiImage = UIImage(data: data) {
let croppedImage = uiImage.cropToBounds(width: 200, height: 200)
await uploadImage(uiImage: croppedImage)
}
}
}
private func uploadImage(uiImage: UIImage) async {
// Upload Code ....
}
var body: some View {
PhotosPicker(selection: $item, matching: .images) {
editableImage()
.opacity(isUploadingImage ? 0.3 : 1)
.overlay {
if !isUploadingImage {
// TODO
} else {
ProgressView()
}
}
.clipShape(Circle())
}
.disabled(isUploadingImage)
.onChange(of: item) {
Task {
await getImage(by: item)
}
}
}
Я пытался
@Sendable private func getImage(by photoPickerItem: PhotosPickerItem?) async { // Code }
я смотрел сеансы Apple для перехода на Swift6, но ничего не работает
я попробовал твой подход. Но это не работает. В нем говорится: «Атрибут @preconcurrency в модуле PhotosUI не имеет никакого эффекта».
Я бы посоветовал сообщить об этом в Apple и подождать.
Я думаю, что лучше всего отключить предупреждение до тех пор, пока Apple не сделает его доступным для отправки. Например, я использую этот подход, чтобы отключить предупреждение, а затем вызвать предупреждение после перехода на Swift 6.
Apple исправила это в Xcode 16 Beta 3.





Я думаю, что лучше всего отключить предупреждение до тех пор, пока Apple не сделает его доступным для отправки. Например, я использую этот подход, чтобы отключить предупреждение, даже если оно имеет обратную силу, а затем активировать предупреждение после перехода на Swift 6.
#if swift(>=6.0)
#warning("Revisit @unchecked Sendable on Swift 6 version, PhotosPickerItem should be Sendable by now.")
#endif
extension PhotosPickerItem: @unchecked Sendable {}
Или, возможно, лучшим решением будет использование небезопасной неизолированной локальной переменной, например:
nonisolated(unsafe) let unsafeValue = photoPickerItem
Я думаю, что один из вариантов — действительно подождать, пока Apple не обновит PhotoKit до современного параллелизма или не представит новую библиотеку. Вы сможете избавиться от предупреждений, комментируя операторы
import PhotoKitс помощью@preconcurrency. Это всего лишь предположение: сам я с PhotoKit не работал.