如何在for循环中结合完成处理方法使用DJI SDK获取无人机图片
优化DJI SDK批量获取图片的实现方案
我来帮你调整成for循环结合异步任务管理的优化方案,解决原单文件处理的局限性,同时确保所有异步任务完成后能统一处理结果:
核心思路
原代码只处理单个媒体文件,批量场景下我们需要:
- 用
for循环遍历所有目标媒体文件 - 用
DispatchGroup管理异步任务,确保所有图片获取完成后触发统一回调 - 收集成功获取的图片和错误信息,方便后续处理
优化后的完整代码
// 定义批量获取图片的方法,接收媒体文件数组和完成回调 func fetchBatchImages(from mediaFiles: [DJIMediaFile], completion: @escaping ([UIImage], [Error]) -> Void) { var fetchedImages: [UIImage] = [] var fetchErrors: [Error] = [] let dispatchGroup = DispatchGroup() // 用于跟踪所有异步任务 for file in mediaFiles { dispatchGroup.enter() // 进入任务组,标记一个待完成任务 file.fetchPreview { error in defer { dispatchGroup.leave() } // 不管成功失败,最后都标记任务完成 if let error = error { print("获取预览图失败:\(error.localizedDescription)") fetchErrors.append(error) return } guard let previewImage = file.preview else { let noImageError = NSError(domain: "DJIMediaError", code: -1, userInfo: [NSLocalizedDescriptionKey: "无预览图数据"]) fetchErrors.append(noImageError) print("文件\(file.fileName ?? "未知")无预览图") return } fetchedImages.append(previewImage) print("成功获取文件\(file.fileName ?? "未知")的预览图") } } // 所有异步任务完成后,触发回调返回结果 dispatchGroup.notify(queue: .main) { completion(fetchedImages, fetchErrors) // 这里也可以直接更新UI,比如把获取到的图片赋值给你的实例变量 self.images = fetchedImages } } // 调用示例:假设你有一个DJIMediaFile数组mediaFiles // self.fetchBatchImages(from: mediaFiles) { images, errors in // // 在这里处理最终的图片数组和错误集合 // if !errors.isEmpty { // print("共有\(errors.count)个文件获取失败") // } // print("成功获取\(images.count)张预览图") // }
关键优化点说明
- 批量处理逻辑:通过
for循环遍历所有媒体文件,不再局限于单个文件 - 异步任务管理:
DispatchGroup确保所有fetchPreview异步操作完成后再执行后续逻辑,避免出现图片未全部加载就更新UI的问题 - 错误统一收集:把每个文件的获取错误收集到数组中,方便后续排查或提示用户
- 主线程回调:
dispatchGroup.notify指定在主线程执行回调,直接可以更新UI,符合iOS开发规范 - defer语句:确保不管任务成功还是失败,都能正确标记任务完成,避免
DispatchGroup永久等待
内容的提问来源于stack exchange,提问作者vhan
相关产品推荐
相关产品推荐

