UICollectionView刷新为空+LivePhoto导出失败(Cocoa错误-1)求助
看起来你遇到了两个iOS开发中的常见问题,我来帮你逐一分析原因并给出解决建议:
问题一:UICollectionView数据源变化后为空,reloadData()不生效
原因分析
- 线程不匹配:你在
AVAssetImageGenerator的异步回调中修改了imagePathArray,这个回调默认在后台线程执行,因此imagePathArray的didSet也会在后台线程触发。而UICollectionView.reloadData()必须在主线程调用,否则不仅不会触发UI刷新,还可能导致UI状态异常。 - 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,本质是系统无法找到你传入的图片/视频文件,核心问题出在路径处理和文件校验上:
- 路径不完整:你调用
exportLivePhoto(cachePath: "/LiveWallpapers/\(uniqueImageName)")时传入的是相对路径,但PHAssetCreationRequest需要的是沙盒内的完整绝对路径。你的图片和视频实际保存在output + "/LiveWallpapers/"目录下,但exportLivePhoto里直接拼接成了根目录路径"/LiveWallpapers/xxx.MOV",这个路径根本不存在。 - 文件写入未做错误校验:你用
try? data.write(to: imageURL)忽略了写入错误,如果图片写入失败,后续的LivePhoto生成自然会因为找不到文件而报错。 - 权限缺失:如果没有申请照片库写入权限,
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
相关产品推荐
相关产品推荐

