Swift 属性的 didSet{} 在哪个线程上执行

作者:编程家 分类: swift 时间:2025-11-07

Swift中的属性观察器是一种强大的特性,它允许我们在属性值被设置之前或之后执行自定义的代码。其中,didSet属性观察器在属性值被设置之后立即调用。但是,问题来了,我们可能会好奇这个didSet属性观察器是在哪个线程上执行的呢?让我们来详细探讨一下。

在Swift中,属性观察器的执行线程是非常重要的,因为它关系到我们在属性观察器中执行的操作是否安全。如果我们在错误的线程上执行代码,可能会导致应用程序崩溃或出现其他不可预测的行为。

didSet属性观察器的执行线程

在Swift中,didSet属性观察器的执行线程取决于属性所属的类型。具体来说,如果属性是存储属性或全局变量,那么didSet属性观察器将在当前线程上同步执行。而如果属性是计算属性,那么didSet属性观察器将在设置属性的代码所在的线程上异步执行。

这意味着,如果我们在存储属性或全局变量的didSet属性观察器中执行了一些耗时的操作,它将会阻塞当前线程,直到操作完成。而对于计算属性的didSet属性观察器,它将在后台线程上执行,不会阻塞当前线程。

案例代码

让我们通过一个简单的案例来演示didSet属性观察器的执行线程。

swift

class Person {

var name: String {

didSet {

print("属性值被设置为:\(name)")

print("当前线程:\(Thread.current)")

}

}

init(name: String) {

self.name = name

}

}

let person = Person(name: "Tom")

person.name = "Jerry"

在上面的代码中,我们定义了一个名为Person的类,它有一个名为name的属性。在name属性的didSet属性观察器中,我们打印了属性值和当前线程。

运行上述代码,我们将得到以下输出:

属性值被设置为:Jerry

当前线程:{number = 1, name = main}

从输出结果可以看出,didSet属性观察器在主线程上同步执行。这是因为name属性是一个存储属性,所以didSet属性观察器在当前线程上立即执行。

在本文中,我们详细讨论了Swift中的属性观察器的执行线程。具体来说,didSet属性观察器在存储属性或全局变量上执行时,会在当前线程上同步执行;而在计算属性上执行时,会在设置属性的代码所在的线程上异步执行。了解属性观察器的执行线程对于编写安全的并发代码非常重要,因为它有助于我们避免许多常见的多线程问题。

希望本文对你理解Swift中的属性观察器的执行线程有所帮助。如果你有任何疑问或建议,请随时在下方留言。感谢阅读!

参考资料:

- [Swift: didSet executing on which thread?](https://stackoverflow.com/questions/38031137/swift-didset-executing-on-which-thread)