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

UICollectionView刷新为空+LivePhoto导出失败(Cocoa错误-1)求助

看起来你遇到了两个iOS开发中的常见问题,我来帮你逐一分析原因并给出解决建议:

问题一:UICollectionView数据源变化后为空,reloadData()不生效

原因分析

  1. 线程不匹配:你在AVAssetImageGenerator的异步回调中修改了imagePathArray,这个回调默认在后台线程执行,因此imagePathArray的didSet也会在后台线程触发。而UICollectionView.reloadData()必须在主线程调用,否则不仅不会触发UI刷新,还可能导致UI状态异常。
  2. IBOutlet空值风险:虽然初始运行正常,但如果didSet触发时collectionView的IBOutlet还未完成绑定(或者在某些场景下被意外置空),if let collectionView = self.collectionView会直接跳过reload操作。

解决建议

  • 强制主线程执行reload:修改didSet代码,确保刷新操作始终在主线程执行,不受触发线程影响:
    private var imagePathArray = [String](){
        didSet {
            print("did set")
            DispatchQueue.main.async { [weak self] in
                guard let collectionView = self?.collectionView else { return }
                collectionView.reloadData()
            }
        }
    }
    
  • 简化CollectionView配置的线程逻辑:setupCollectionView一般在viewDidLoad(主线程)中调用,没必要把delegate/dataSource的设置包在DispatchQueue.main.async里,直接去掉即可:
    func setupCollectionView(){
        self.collectionView.delegate = self
        self.collectionView.dataSource = self
        self.collectionView.register(UINib(nibName: "WallPapersCell", bundle: nil), forCellWithReuseIdentifier: "WallPapersCell")
    }
    
  • 检查IBOutlet连接:确认storyboard/xib中collectionView的IBOutlet已经正确连接到VC的属性,没有出现断开或误绑定的情况。
问题二:生成LivePhoto时报错"The operation couldn’t be completed. (Cocoa error -1.)"

原因分析

这个错误属于NSFileReadUnknownError,本质是系统无法找到你传入的图片/视频文件,核心问题出在路径处理和文件校验上:

  1. 路径不完整:你调用exportLivePhoto(cachePath: "/LiveWallpapers/\(uniqueImageName)")时传入的是相对路径,但PHAssetCreationRequest需要的是沙盒内的完整绝对路径。你的图片和视频实际保存在output + "/LiveWallpapers/"目录下,但exportLivePhoto里直接拼接成了根目录路径"/LiveWallpapers/xxx.MOV",这个路径根本不存在。
  2. 文件写入未做错误校验:你用try? data.write(to: imageURL)忽略了写入错误,如果图片写入失败,后续的LivePhoto生成自然会因为找不到文件而报错。
  3. 权限缺失:如果没有申请照片库写入权限,PHPhotoLibrary的写入操作也会失败,可能表现为类似的模糊错误。

解决建议

  • 传递完整绝对路径前缀:调用exportLivePhoto时传入包含output的完整路径,而不是相对路径:
    // 替换原来的调用
    let fullCachePath = "\(output)/LiveWallpapers/\(uniqueImageName)"
    self?.exportLivePhoto(cachePath: fullCachePath)
    
  • 添加文件写入的错误处理:把try?换成do-catch来捕获写入错误,同时检查文件是否确实生成:
    do {
        try data.write(to: imageURL, options: [.atomic])
        guard FileManager.default.fileExists(atPath: imageURL.path) else {
            print("图片写入失败,文件不存在")
            return
        }
        print("Load image url \(imageURL)")
        // 后续操作...
    } catch {
        print("图片写入错误:\(error.localizedDescription)")
        return
    }
    
  • 确保照片库写入权限:在Info.plist中添加NSPhotoLibraryAddUsageDescription键,填写权限申请描述(比如"需要保存LivePhoto到你的相册"),并在代码中提前请求权限:
    PHPhotoLibrary.requestAuthorization(for: .addOnly) { status in
        if status != .authorized {
            print("照片库写入权限未授权,请在设置中开启")
            // 这里可以添加弹窗提示用户前往设置
        }
    }
    
  • 验证assetIdentifier一致性:确保图片和视频写入时使用的assetIdentifier完全一致,这是LivePhoto能被系统正确识别的必要条件(你当前的代码已经做到了,但可以再确认一下)。

内容的提问来源于stack exchange,提问作者osxDev123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:23:27