迁移时 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 并允许在后台线程上执行迁移。
请记住,在真正打开 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
}
在本教程中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 并允许在后台线程上执行迁移。
请记住,在真正打开 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
}