我在Swift中定义了一个属性,如:
var foo : String { didSet { doSomething() } }
因此,每次我设置foo
就像foo = "bar"
我didSet
将被执行.
但是我无法找到正在执行的线程 didSet
.
例如,在这种情况下会发生什么:
dispatch_async(some_queue, { () -> Void in self.foo = "bar" })
这将导致didSet
代码被执行.将didSet
继续运行some_queue
或始终运行main_queue
?
该物业观察家willSet
和didSet
被直接从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 ...