首页 > 解决方案 > 块的范围是什么?

问题描述

我有几个函数,每个函数都执行一些与领域相关的任务。另一个函数将这些调用的某些序列分派到后台串行队列中,如下所示:

let serialQueue = DispatchQueue(label: "com.CanHarveyDentBeTrusted", qos: DispatchQoS.userInitiated)

func doStuff() {
    serialQueue.async {
        a()
        b()
        c()
        d()
        e()
        f()
    }
}

在此链接中:https ://github.com/realm/realm-cocoa/issues/1970,bdash 说:

“Realm 对其对象使用线程限制,因此您需要确保对给定对象的所有工作都在同一个线程上执行。由于 GCD 不保证提交给给定串行队列的所有块都将在同一个线程上执行,你需要在每个块中获取一个新的 Realm 实例。”

所以现在,所有函数都在 do try catch 块中创建一个 Realm 实例,然后它们对领域对象进行自己的工作。

我的问题是,如果我有一堆涉及函数 af 的不同序列,但所有序列都以函数 a 开头,我可以让 bf 强制创建领域吗?

来自领域文档(https://realm.io/docs/swift/latest):

“就像任何磁盘 I/O 操作一样,如果资源受到限制,创建 Realm 实例有时可能会失败。实际上,这只会在第一次在给定线程上创建 Realm 实例时发生。随后从同一线程访问 Realm将重用缓存的实例,并且总是会成功。”

我不知道 doStuff() 是否会将所有这些调用作为一个块调度,每个 af 调用都在该块内。或者,如果每个 af 调用实际上都在它们自己的单独块中。

因为如果它们不在同一个块上下文中,那么我不能在这些调用中强制创建领域,因为据我了解,它们可能不在同一个线程上运行。

标签: iosswiftrealmgrand-central-dispatch

解决方案


推荐阅读