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

时间:2015-12-02 09:36:24

标签: multithreading swift closures

我在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上运行还是始终在create table flatower and add mobile column $post_id = 1; $sql = "select mobile from flatowner where id='$post_id'"; $res = mysql_query($con,$sql); $row = mysql_fetch_array($res); $owner_mobile = $row[0]['mobile']; 上运行?

1 个答案:

答案 0 :(得分:13)

属性观察者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
    ...