Environment
Swift
iOS 14.4
On a real iPhone 8 device
Code
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { // close picker picker.dismiss(animated: true, completion: nil) // check canceled if results.count == 0 { debugPrint("PHImagePicker was canceled") return } if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) { itemProvider.loadObject(ofClass: UIImage.self, completionHandler: {image, error in // do something. }) } }
Symptom
When an image is selected by PHPicker, the following error message was reported.
2021-02-20 00:12:24.794146+0900 *** [6290:1858791] [default] [ERROR] Could not create a bookmark: NSError: Cocoa 257 “The file couldn’t be opened because you don’t have permission to view it.” }
Main Thread Checker: UI API called on a background thread: -[UIImageView setImage:]
Error Message #1
Could not create a bookmark: NSError: Cocoa 257 “The file couldn’t be opened because you don’t have permission to view it.”
Solution #1
So far, the code works for me as expected with the message. It seems the error message could be ignored.
Stay tuned with the Apple Developer Forum
Error Message #2
Main Thread Checker: UI API called on a background thread: -[UIImageView setImage:]
Cause #2
imageView has been accessed from the PHPicker completion handler as follows.
itemProvider.loadObject(ofClass: UIImage.self,
completionHandler: {image, error in
guard let image = image as? UIImage
…
GUI operations should be called in the main thread.
Solution #2
In the completionHandler, image should be handled in the main thread.
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { // close picker picker.dismiss(animated: true, completion: nil) // check canceled if results.count == 0 { debugPrint("PHImagePicker was canceled") return } if let itemProvider = results.first?.itemProvider, itemProvider.canLoadObject(ofClass: UIImage.self) { itemProvider.loadObject(ofClass: UIImage.self, completionHandler: {image, error in DispatchQueue.main.async { guard let image = image as? UIImage else { debugPrint("Error: UIImage is nil") return } self.imageView.image = image } }) } }