2015-12-02 55 views
4

我在斯威夫特定义的属性,如:在哪个线程上执行Swift属性的didSet {}?

var foo : String { 
    didSet { 
    doSomething() 
    } 
} 

所以每次我设置foofoo = "bar"didSet将被执行。

但是我找不到在哪个线程didSet正在执行。

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

dispatch_async(some_queue, {() -> Void in 
    self.foo = "bar" 
}) 

这将导致被执行的代码didSetdidSet将在some_queue上运行,还是始终在main_queue上运行?

+0

你可以用'NSThread.isMainThread()''中didSet'找出程序在那里运行的线程。如果你使用dispatch_async(some_queue ....)来设置属性,它必须在some_queue上调用 –

+0

我知道如何强制一个队列,我只想知道默认行为 – funkenstrahlen

回答

8

酒店观察家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 
    ... 
+0

实际上有趣的信息。我一直在考虑使用NSThread类来学习iOS中多线程的行为,你会知道如何使用这样的类来获得相同的结果吗? – Eppilo

相关问题