You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:42:02