2012-08-09 74 views
1

我有一大堆旋轉動畫UIView實例,其內容設置爲各種CGImage,它們都是(並且本質上是需要的)在運行中創建的。它工作得很好,但圖像生成速度很慢(大約1/4秒到1秒 - 即不可接受)。所以我想要做的是非常快速地產生一個低分辨率的近似值(比如1/100秒),並將UIView的CALayer的內容(例如,view.layer.contents)設置爲快速的低分辨率圖像,並且然後立即產生後臺線程以生成高分辨率版本,以便在準備就緒後立即替換低分辨率版本。在後臺線程上呈現新的UIView圖層內容?

什麼是一些明智的方法來做到這一點?

我的想法是我應該使用GCD(Grand Central Dispatch)安排後臺線程,然後在完成時再次使用它發送消息。如果我這樣做了,發送新的高分辨率替換圖像作爲完成消息的一部分是否合理?

如果我需要取消後臺線程該怎麼辦?如果用戶前往不同的對象,會發生這種情況,在這種情況下,我必須取消當前的後臺任務併爲其他視圖啓動一個新的後臺任務。 (這實際上是一個相當常見的事件,所以我一定要處理它)。我不認爲我可以殺死後臺任務,因爲它可能處於處理CGPath,CGGradient,CGImage等對象的過程中那需要被釋放。另一種可以測試的線程設置標誌的方法有哪些?我應該從主線程向後臺線程發送某種「中止」信號,然後讓背景線程在最舒適的位置自行放棄創建圖像?

+2

從[WWDC 2012](https://developer.apple.com/videos/wwdc/2012/)觀看會話211 - 在iOS上構建併發用戶界面。它有很多信息直接解決你的問題。你可能也想看看會話235和238. – 2012-08-09 03:42:58

+0

很酷,我剛看完#211。可能,NSOperationQueue聽起來像是要走的路。謝謝。 – 2012-08-09 04:46:10

+1

感謝rob mayoff,在觀看Session 211之後,我解決了我的UITableView性能問題! – vampirewalk 2013-03-24 05:26:41

回答

1

我不會爲此使用GCD。 GCD在更新回調界面時遇到問題。如果你這樣做每個圖像它會破壞性能。只要分離一個單獨的線程,並實現高清晰度圖像,每次圖像渲染時就會連續執行回調。它更簡單,你對主線程的回調將顯示更快。

由於某種原因GCD的UI更新似乎不太可靠,因爲速度太慢。不知道這是爲什麼。

+0

嗯,我想不是輔助線程會更新用戶界面,但輔助線程會在完成時向主線程發送消息(包含完成的圖像)​​,然後主線程將更新用戶界面。 – 2012-08-09 04:45:46

+1

是的,這是真的,它必須,但由於這個原因,GCD不是太有效,因爲我必須刪除GCD代碼。 [self performSelectorOnMainThread:@selector(update :) withObject:value waitUntilDone:NO]; 從後臺線程工作得很好 – 2012-08-09 04:52:58