2011-06-14 26 views
6

我正在創建小磁貼並存儲在磁盤上並顯示給用戶。這是我做這個當前進程:將UIVIew渲染爲後臺線程上的圖像的安全方法?

  1. 創建一個代表我想顯示屏幕
  2. 獲取從視圖控制器的觀點,並從中渲染圖像
  3. 將其保存到磁盤的UI一個視圖控制器和稍後在屏幕上顯示它

當我試圖訪問viewcontroller的視圖時,我崩潰了。當我試圖在網上進行研究時,我在後臺創建視圖是否安全時遇到了相互矛盾的結果。我讀到的UIGraphicsGetCurrentContext調用應該是線程安全的,但也許不訪問後臺線程上的UIView?我正在爲iOS 4及以上版本編寫應用程序。下面是我使用的代碼(瓦是視圖 - 控制):試圖訪問區塊(EXC_BAD_ACCESS)的.view屬性時發生

CGSize size = CGSizeMake(20.0f, 30.0f); 
UIGraphicsBeginImageContext(size); 
[tile.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();   
UIGraphicsEndImageContext(); 

崩潰。整個過程是在後臺渲染視圖以防止鎖定UI,因爲要處理的瓦片很多。

有沒有安全的方法來做到這一點?

+1

你有沒有找到一個很好的解決方案呢? – 2012-11-01 06:18:32

+0

我遇到了同樣的崩潰。根據[Apple的文檔](http://developer.apple.com/library/ios/#qa/qa1714/_index.html),'renderInContext'可以在不同的線程上使用。然而,事實上,它神祕地崩潰。有沒有人找到解決這個問題的辦法? – Howy 2013-07-16 20:54:36

+0

你有沒有找到解決方案,馬克? – 2017-09-22 11:16:00

回答

2

我從來沒有嘗試過你所描述的,我不喜歡成爲壞消息的持有者,但從Apple's documentation採取。

注:在大多數情況下,UIKit類 應該僅僅從 應用程序的主線程中使用。這是 尤其適用於來自UIResponder的衍生 或涉及 以任何方式操縱應用程序的用戶 接口。

當然,他們方便說:「在大多數情況下」,使留下一些餘地。

+0

如何在不操縱它的情況下傳遞視圖?在這一點上,我實際上並沒有在屏幕上處理UI。我只是創建一個視圖並將其保存到圖像。如果我不把它放在屏幕上,是否有安全的方法來處理這個問題? – 2011-06-14 20:56:57

+0

在單獨的線程中將映像寫入磁盤當然可以以安全的方式完成。然而,從calayer獲得圖像...不要說實話。我想這一切都取決於'renderInContext'內部發生了什麼,但是據我所知,這種信息沒有記錄在任何地方。 – Pieter 2011-06-15 08:39:58

+0

謝謝彼得。我將嘗試爲我們的方法找到解決方法。 – 2011-06-16 13:43:09