2012-08-09 80 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