PHPickerViewController多选图片保存后重加载显示重复相同图片问题排查
问题原因
- 存储文件名重复:你在for循环外部生成了唯一的UUID作为
imgName,一次多选操作中所有选中的图片都使用同一个文件名写入本地,后写入的图片会直接覆盖之前的文件。退出页面再返回时,所有图片记录都会读取同一个本地文件,因此展示为完全相同的图片。 - 类型校验逻辑错误:你仅校验了选中结果中第一个资源的itemProvider是否支持加载UIImage,若第一个选中资源非图片类型,后续所有图片资源都会被跳过,无法加载。
- 无效的提前刷新:for循环结束后直接执行的
collectionView.reloadData()无实际作用,loadObject是异步接口,执行到该行时所有图片还未完成加载,无法触发内容刷新。
修正后代码
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) { picker.dismiss(animated: true, completion: nil) for result in results { let itemProvider = result.itemProvider guard itemProvider.canLoadObject(ofClass: UIImage.self) else { print("wrong") continue } // 每次循环生成唯一的图片名称,避免文件名重复覆盖 let imgName : String = UUID.init().uuidString itemProvider.loadObject(ofClass: UIImage.self, completionHandler: { (image, error) in if let newImage = image as? UIImage { DispatchQueue.main.async { [self] in let newImgInfo = MediaHandler.saveImg(albumName: albumName, imgUrl: imgName) self.imageArray.append(newImage) print(self.imageArray.count) self.imageDataArray.append(newImgInfo) DataHandler.saveImgData(imageName: imgName, image: newImage) self.collectionView.reloadData() } } else { print("wrong") } }) } }
内容的提问来源于stack exchange,提问作者mmoore410
相关产品推荐
相关产品推荐

