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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:22:37