// ... existing code ... // 2. 比较特征相似度并分组 group.notify(queue: processingQueue) { progressHandler("正在比较相似度...", 0.6) // 近似度 let similarityThreshold: Float = 0.7 var similarGroups: [[PHAsset]] = [] // 使用并行处理来加速比较 let processingGroup = DispatchGroup() let processingQueue = DispatchQueue(label: "com.yourapp.similarity.processing", attributes: .concurrent) let resultsQueue = DispatchQueue(label: "com.yourapp.similarity.results") let semaphore = DispatchSemaphore(value: 8) // 控制并发数量 // 创建一个线程安全的数据结构来存储结果 var processedIndices = Atomic>(Set()) var groupResults = Atomic<[Int: [PHAsset]]>([:]) // 分批处理,每批处理一部分数据 let batchSize = min(100, imageFeatures.count) let batches = Int(ceil(Float(imageFeatures.count) / Float(batchSize))) for batchIndex in 0..= similarityThreshold { similarAssets.append(imageFeatures[j].asset) processedIndices.mutate { $0.insert(j) } } } catch { print("相似度计算失败: \(error)") } } // 只保存有多个相似图像的组 if similarAssets.count > 1 { resultsQueue.async { groupResults.mutate { $0[i] = similarAssets } } } // 更新进度 let progress = Float(processedIndices.value.count) / Float(imageFeatures.count) DispatchQueue.main.async { progressHandler("正在比较相似度...", 0.6 + progress * 0.4) } semaphore.signal() processingGroup.leave() } } } processingGroup.wait() // 整理结果 similarGroups = Array(groupResults.value.values) // 按照照片数量降序排序 similarGroups.sort { $0.count > $1.count } DispatchQueue.main.async { completion(similarGroups) } } // ... existing code ...