Итак, у меня есть приложение SwiftUI, которое позволяет пользователю анализировать содержимое выбранного изображения и сохранять его для последующего использования. Часть сделана. Я хочу удалить выбранное изображение из библиотеки фотографий пользователя после завершения синтаксического анализа.
Вот упрощенная версия моего кода:
struct NewItemView: View {
@State private var shouldDeleteImage = true
@State private var photosPickerItem: PhotosPickerItem?
var body: some View {
NavigationView {
Form {
Section("image") {
PhotosPicker(selection: $photosPickerItem) {
Label("Select a Duolingo Photo", systemImage: "photo")
}
}
.onChange(of: photosPickerItem) { selectedPhotosPickerItem in
guard let selectedPhotosPickerItem else {
return
}
debugPrint(selectedPhotosPickerItem)
Task {
isBeingParsed = true
await updatePhotosPickerItem(with: selectedPhotosPickerItem)
isBeingParsed = false
}
}
Section("Parsed content") {
// show content here..
}
}
.navigationTitle("New item")
}
}
private func updatePhotosPickerItem(with item: PhotosPickerItem) async {
photosPickerItem = item
if let photoData = try? await item.loadTransferable(type: Data.self) {
let image = UIImage(data: photoData)
// process the image..
// 💥 it breaks here: itemIdentifier is always nil
self.deleteImage(assetIdentifier: item.itemIdentifier!)
}
}
// how to get the assetIdentifier here 😫
private func deleteImage(assetIdentifier: String) {
let fetchResult = PHAsset.fetchAssets(withLocalIdentifiers: [assetIdentifier], options: nil)
guard let asset = fetchResult.firstObject else { return }
PHPhotoLibrary.shared().performChanges {
PHAssetChangeRequest.deleteAssets([asset] as NSArray)
} completionHandler: { success, error in
if success {
print("Image deleted from photo library")
} else {
print("Error deleting image from photo library: \(error?.localizedDescription ?? "unknown error")")
}
}
}
}
Любая идея, как получить идентификатор актива? Или любой другой обходной путь, который поможет достичь моей цели, очень приветствуется
Я забыл раскомментировать функцию, но itemIdenfier
всегда равен нулю. Вот в чем дело :)
Ах хорошо. Это потому, что вы не указали библиотеку фотографий.
Причина, я думаю, что вы получили идентификаторы nil
, заключается в том, что вы не указали библиотеку фотографий при создании PhotosPicker
.
Например:
PhotosPicker(selection: $photosPickerItem, matching: ..., photoLibrary: .shared()))
Помимо того, что вызов функции удаления закомментирован, что на самом деле не так с вашим кодом? Как это ломается?