Stall Core-animation用于并发Core-graphics处理

时间:2013-08-11 18:10:18

标签: ios objective-c core-animation core-graphics nsrunloop

我正在寻找一种方法来阻止核心动画,直到我完成核心图形处理。我尝试过几种方法,但似乎没什么用。

背景: 我需要做很多Core-Graphics绘图。所有处理都在ImageContext中完成,因此我同时渲染图像,一旦完成,我将相应的layer.content设置为生成的图像(在主线程上)。我遇到的问题是,在我处理图像之前,当前的运行循环通常会结束,而核心动画将在动画期间没有适当的视图背景(通常显示黑色背景)的情况下开始。我需要一种方法来停止核心动画,直到所有并发图像处理完成。

我还做了很多“标记”:缓存生成的图像并返回它,这样我就不必执行不必要的处理了。我相信这会排除使用[CALayer drawInContext:]并设置drawsAsynchronously = YES;,因为我不想为每个视图重新处理核心图形。

这是我尝试过的:

  • 我尝试在“等待”(运行空performSelector)的方法上使用while loop直到处理完成,但是你只能立即执行选择器(太快) ,或者在下一个使用delay的运行循环中(太晚了)。
  • 我尝试在主循环中添加一个观察者:

代码:

    CFRunLoopObserverRef observer = CFRunLoopObserverCreateWithHandler(NULL, kCFRunLoopAllActivities, YES, 0, ^(CFRunLoopObserverRef observer, CFRunLoopActivity activity) {
        [[Themes class] performSelectorOnMainThread:@selector(waitOnDraw) withObject:nil waitUntilDone:YES modes:Array(NSRunLoopCommonModes)];
    });
    CFRunLoopAddObserver(CFRunLoopGetMain(), observer, kCFRunLoopCommonModes);

注意:kCFRunLoopAllActivities过度,但其他模式都没有效果。只是试着掩盖我的所有基础。

如果我可以访问核心动画运行的线程,也许我可以直接停止它,但我不知道如何访问该线程。

就是这样......我想不出任何其他办法。

非常感谢任何帮助。

注意:我知道我可以在主线程上运行所有处理,但我正在寻找尽可能多的性能提升。同时处理核心图形代码确实可以加快新设备的速度。

0 个答案:

没有答案