如果你的 App 不支持目录级同步(iCloud 不建议直接搬整个目录),但用户又解压出一个包含 大量文件(几百~几千) 的目录,你需要解决:

  1. iCloud Document 目录不能直接 move 整个目录
  2. 文件数量太大,逐个 copy 性能差、阻塞主线程
  3. iCloud 有文件数限制(隐性,但影响性能)
  4. 同步会很慢或导致 NSMetadataQuery 卡死

下面给你一个「大文件夹迁移到 iCloud」的最佳实践方案,是文件管理类 App(如 Documents、FileBrowser)实际使用的模式。


✅ 总体策略:两层逻辑

1. 本地解压后的目录保持在沙盒,不直接迁移整个目录

  • iCloud 不适合同步「大量小文件」
  • 用户未必需要全部文件上传到云端

2. 只按需上传用户选择的文件,不是整个目录结构

  • 文件管理类 App 的通用做法
  • 减少 iCloud 同步成本
  • 避免移动上千个文件导致 UI 卡顿和设备资源爆炸

🎯 三种可行处理方式(按最佳→一般排序)


⭐ 方案 1:打包 → 上传一个文件(强烈推荐)

当解压后产生大量文件时,把整个目录重新压缩成一个 .zip,只上传这个压缩包。

优点:

  • iCloud 只上传一个文件,同步快、稳定
  • 避免上百/上千个文件导致 iCloud 卡死或拒绝同步
  • 下载恢复时再解压即可

典型流程:

// 伪代码
let zipURL = createZip(fromFolder: extractedFolderURL)
moveToICloud(zipURL)

Documents / PDF Expert 就是这样处理的。


⭐ 方案 2:增量上传(用户选择哪些文件/夹上传)

不要全量上传,改为:

👉 用户在列表中选中文件
👉 只上传选中的
👉 文件过多时给一个提示「不建议一次上传大量文件」

技术点:

  • 异步队列处理(串行)
  • 每个文件 copy → delete local
  • 上传状态由 MetadataQuery 监听

伪代码:

for file in selectedFiles {
    queue.async {
        try? moveToICloud(file)
    }
}

优点:

  • 控制云端文件数量
  • 避免 iCloud 目录过大、同步失败

⭐ 方案 3:子目录→单文件 copy(文件数量大但必须上传)

如果你必须上传大目录(不推荐,但可行):

必须采用异步批处理 + 分段迁移:


🔹 步骤 1:遍历目录

let files = try FileManager.default.contentsOfDirectory(
    at: folder, includingPropertiesForKeys: nil
)

如果文件超过 X(例如 200),建议分批处理:

let batchSize = 50
let batches = files.chunked(into: batchSize)

🔹 步骤 2:串行队列逐个处理

let queue = DispatchQueue(label: "icloud.move.queue")

for batch in batches {
    queue.async {
        for file in batch {
            try? moveToICloud(file)
        }
    }
}

🔹 步骤 3:避免创建大量 iCloud 文件(非常重要)

iCloud 对「海量小文件」性能极差,会导致:

  • 上传卡死
  • 设备变慢
  • MetadataQuery 无响应
  • iCloud 崩溃(真实案例)

做法:

✔ 最小化 iCloud 文件数量
✔ 尽可能合并、压缩


⚠️ 不要做的事情(非常关键)

⛔ 1. 不要直接 move 整个目录

try? FileManager.default.moveItem(at: localFolder, to: iCloudFolder)

这种做法在 iCloud 上非常不稳定,甚至会导致目录损坏或同步失败。


⛔ 2. 不要一次性将几百上千个文件全部上传

iCloud 不适合大规模小文件同步(设计如此)。
你会遇到:

  • 传输极慢
  • iCloud 进度不准确
  • MetadataQuery 事件爆炸
  • 设备内存飙升

⛔ 3. 不要对 iCloud 目录执行大量写入操作

尤其是解压缩直接写入,有概率触发大量上传任务,导致同步卡顿数小时。


📌 最推荐的总结方案

方案 推荐度 适用场景
打包成 zip 上传 ⭐⭐⭐⭐⭐ 大量小文件、目录结构复杂
用户手动选择文件上传 ⭐⭐⭐⭐ 普通文件管理 App
分批异步上传 ⭐⭐ 确实必须全部上传时