2015-12-02 48 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

相關問題