У меня проблемы с пониманием комбайнов и издателей. У меня есть PhotoPicker, который выбирает одно или несколько изображений из библиотеки фотографий. Эти изображения следует добавить в мою основную модель данных. Это обрабатывается в моем модельном классе.
Однако я попадаю в бесконечный цикл, которого я не понимаю. View продолжает обновляться, а метод onReceive продолжает выполняться снова и снова, снова и снова визуализируя View. Ниже приведен пример кода (без основных данных), который ведет себя так же
Образец кода:
struct MyImage: Hashable {
var id: String
var uiImage: UIImage
}
class Model: ObservableObject {
@Published var images: [MyImage] = []
func add(uiImage: UIImage) {
let id = UUID().uuidString
let image = MyImage(id: id, uiImage: uiImage)
self.images.append(image)
}
}
struct ContentView: View {
@StateObject var model = Model()
@State var showPhotoPicker = false
@State var pickerResult: [UIImage] = []
var body: some View {
VStack {
ForEach(model.images, id: \.self) { image in
Text(image.id)
}
Button(action: { showPhotoPicker.toggle() }) {
Text("ADD")
}
.fullScreenCover(isPresented: $showPhotoPicker) {
let config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
PhotoPicker(configuration: config, pickerResult: $pickerResult)
}
}
.onReceive(pickerResult.publisher, perform: { image in
model.add(uiImage: image)
})
}
}
struct PhotoPicker: UIViewControllerRepresentable {
@Environment(\.presentationMode)
var presentationMode
let configuration: PHPickerConfiguration
@Binding var pickerResult: [UIImage]
func makeCoordinator() -> Coordinator {
Coordinator(self)
}
func makeUIViewController(context: Context) -> PHPickerViewController {
let controller = PHPickerViewController(configuration: configuration)
controller.delegate = context.coordinator
return controller
}
func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {
}
class Coordinator: PHPickerViewControllerDelegate {
private let parent: PhotoPicker
init(_ parent: PhotoPicker) {
self.parent = parent
}
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
self.parent.pickerResult = []
results.forEach { (image) in
if image.itemProvider.canLoadObject(ofClass: UIImage.self) {
image.itemProvider.loadObject(ofClass: UIImage.self) { (newImage, error) in
if let error = error {
print(error.localizedDescription)
} else {
self.parent.pickerResult.append(newImage as! UIImage)
}
}
} else {
print("Loaded Assest is not a Image")
}
}
self.parent.presentationMode.wrappedValue.dismiss()
}
}
}
Может кто-нибудь объяснить, что происходит?