dunoiww
dunoiww

Reputation: 33

When I pick image from library, the message below always appears. Why?

Error:

Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

The message when I pick image from library

struct ImagePicker: UIViewControllerRepresentable {
    @Binding var image: UIImage?

    class Coordinator: NSObject, PHPickerViewControllerDelegate {
        var parent: ImagePicker

        init(_ parent: ImagePicker) {
            self.parent = parent
        }

        func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
            picker.dismiss(animated: true)

            guard let provider = results.first?.itemProvider else { return }

            if provider.canLoadObject(ofClass: UIImage.self) {
                provider.loadObject(ofClass: UIImage.self) { image, _ in
                    self.parent.image = image as? UIImage
                }
            }
        }
    }

    func makeUIViewController(context: Context) -> PHPickerViewController {
        var config = PHPickerConfiguration()
        config.filter = .images

        let picker = PHPickerViewController(configuration: config)
        picker.delegate = context.coordinator
        return picker
    }

    func updateUIViewController(_ uiViewController: PHPickerViewController, context: Context) {
    }

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    } 
}

I want to know how to solve it. Thanks!

Upvotes: 0

Views: 101

Answers (1)

Harsh Vardhan
Harsh Vardhan

Reputation: 1

The image you are getting from the provider through loadObject is returned on background thread so you need to call you UI from main thread. So instead of writing

self.parent.image = image as? UIImage

Please write

DispatchQueue.main.async {
    self.parent.image = image as? UIImage
}

Upvotes: 0

Related Questions