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

fun*_*len 10 multithreading closures swift

我在Swift中定义了一个属性,如:

var foo : String {
  didSet {
    doSomething()
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,每次我设置foo就像foo = "bar"didSet将被执行.

但是我无法找到正在执行的线程 didSet.

例如,在这种情况下会发生什么:

dispatch_async(some_queue, { () -> Void in
     self.foo = "bar"
})
Run Code Online (Sandbox Code Playgroud)

这将导致didSet代码被执行.将didSet继续运行some_queue或始终运行main_queue

Mar*_*n R 15

该物业观察家willSetdidSet直接从setter方法中调用,之前/新的值存储之后,所以这一切都执行相同的线程上.

您可以通过设置断点didSet并检查堆栈回溯来验证它,如下所示:

* thread #2: tid = 0x4df3, 0x000000010024f9eb swtest2`swtest2.foo.didset : Swift.String(oldValue="foo") + 27 at main.swift:6, queue = 'myQueue', stop reason = breakpoint 1.1
  * frame #0: 0x000000010024f9eb swtest2`swtest2.foo.didset : Swift.String(oldValue="foo") + 27 at main.swift:6
    frame #1: 0x000000010024fb91 swtest2`swtest2.foo.setter : Swift.String(newValue="bar") + 177 at main.swift:4
    frame #2: 0x000000010024fe3a swtest2`swtest2.(closure #1) + 42 at main.swift:13
    ...