2015-12-27 14 views
0

我有一個奇怪的用戶界面行爲,這讓我覺得這個API可能是異步的。假設它是(異步),我做了一些更改,現在UI按預期工作。我在Apple的文檔中找不到答案。 有人熟悉或有過這方面的經驗嗎?它真的是異步嗎?謝謝!是[NSWindow setFrame:display:] API異步?

編輯:所有UI更改正在從主線程進行。

回答

0

setFrame:display:更新了框架,並告訴系統在下一個繪製週期中重繪窗口(可能還有子視圖)。可可繪圖總是在繪圖週期中完成,而不是在您調用繪圖方法的那一刻。有關這方面的更多討論,請參閱What is the most robust way to force a UIView to redraw?

這可以認爲繪畫是「合併」而不是「異步」。除非有動畫,否則在下一個事件循環之前,所有繪圖通常應該完成。有可能某個視圖會以某種方式延遲其繪製到後來的事件循環,但很少見。 10.8+中的圖層支持視圖可以支持實際的異步繪圖,但這不是默認設置。

從你的描述來看,你有可能從主線程以外的線程調用setFrame:display:。 AppKit繪圖不是線程安全的。除了主線程外,你不能從任何地方調用繪圖方法,否則你會得到「奇怪的UI行爲」。 (這並非完全正確,在OS X上,您可以使用lockFocus從其他線程中繪製,但在解鎖焦點後直到下一個繪製週期纔會實際應用它們,但通常最好是從現代OS X中的主線程,因爲GCD使得這一點變得簡單。)

+0

所有UI更改都是從主線程中進行的。 – Sanich

+0

對於'奇怪'行爲更具體一些,在'setFrame:display:'後立即執行Z-排序時,有時不會執行Z-Ordering。 「繪畫循環」是什麼意思? – Sanich

+0

繪圖循環發生在事件循環結束時。 Cocoa調用了一些你的方法('drawRect:',一個定時器事件,不管)。至少從該函數返回之前,繪圖不會發生。 'setFrame:display:'不應該修改z順序,所以我不知道你的意思是「被執行」。 –