迁移时 Realm.Configuration() 是同步的还是异步的?

Is Realm.Configuration() synchronous or asynchronous when doing migration?

在本教程中https://ali-akhtar.medium.com/migration-with-realm-realmswift-part-6-11c3a7b24955

就是下面的代码:

所有这些代码都是同步的 - 试试吧! Realm(configuration: configuration) 假设配置已经完成并且有效。

但是如果要迁移的对象有几十万、几百万,而且迁移步骤很复杂,遍历需要一些时间,那怎么办?

线程是否会挂起,直到 Realm.Configuration() 完成,然后下一行才会成功执行。或者是 Realm.Configuration() 实现异步等试试!会因为 Realm.Configuration() 在另一个线程中执行冗长的任务而崩溃吗?

超级有趣的问题和答案包含在文档中,但让我提供一些细节。

此外,为清楚起见,迁移仅适用于仅限本地的领域。如果您正在使用领域同步(MongoDB 领域)迁移不适用。

教程中的代码和问题中的代码假设迁移不会耗时。然而,情况可能并非总是如此——迁移中可能处理了数百万个对象

因此使用 Realm.asyncOpen 将异步打开一个 Realm 并允许在后台线程上执行迁移。

asyncOpen(configuration:)

请记住,在真正打开 Realm 之前不会发生迁移。

因此,在较高级别上,可以设置异步函数来定义迁移函数,使用 .async 打开 Realm,这将开始迁移,然后在完成时调用完成处理程序。像

MyMigrationHandler
   static func doMigrate(completion: @escaping() -> Void {
      let someConfig = Realm.Configuration(... define migration closure

      Realm.asyncOpen(configuration: someConfig ) { result in
         Realm.Configuration.configuration = someConfig
         handle result being .failure or .success
         completion()
      }
   }
}

它会被异步调用

MyMigrationHandler.doMigrate {
   this code executes once the migration has completed
}