2010-06-18 11 views
4

我知道drawLayer:drawlayer:inContext:在使用CATiledlayer時在多個線程上被調用,但drawRect:怎麼辦?drawRect:在使用CATiledlayer時調用多個線程嗎?

Apple的PhotoScroller示例代碼使用drawRect:從磁盤獲取其圖像,並且它沒有用於處理線程的特殊代碼。

我想確定我的CATiledLayer模型是否必須是線程安全的。

回答

1

你見過這個technical Q&A from Apple

它不直接回答你的問題,但它可以幫助你決定如何實現你的模型。

+0

該文章包含一個矛盾,但它幾乎說明你必須進行線程化。觀看WWDC會議視頻給了我更多的難題,讓我相信這是事實。 – 2010-06-19 03:22:50

2

是的,drawRect可以並將在多個線程上調用(在OS 4.2上測試)。

如果您的繪圖足夠快以超過新縮放手勢的到達,您的應用可能會正常工作,直到通過快速輸入縮放手勢進行測試,則此行爲不太明顯。

一種替代方法是讓您的模型線程安全。

如果線程安全是通過同步大多數數據模型的訪問到一個繪圖線程來實現的話,那麼您可以做同樣的事情來使用@syncrhonize(self)之類的東西來互斥drawRect體似乎工作。

我還沒有找到一種方法來請求CATiledLayer只使用一個後臺線程。

+0

您也可以考慮不直接將模型分配給視圖對象(您的圖層)。但是讓您的控制器處理模型更改並僅將不可變的線程安全對象分配給圖層。如果模型更改,您可以隨時更新圖層並調用setNeedsDisplay。 – Alej 2011-11-15 22:23:38

2

我發現CATiledLayer在iOS模擬器中使用多個後臺線程,但在我的iPhone上使用單個後臺線程。

我的Mac有一個雙核處理器,而我的iPhone有一個單核(A4)。

我懷疑帶有A5 CPU的iOS設備也會使用多個線程。

相關問題