2

我正在寻找一种方法来停止核心动画,直到我可以完成对核心图形的一些处理。我尝试了几种方法,但似乎没有任何效果。

背景:我需要做很多核心图形绘图。所有的处理都是在 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是矫枉过正,但其他模式都没有工作。只是试图涵盖我所有的基础。

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

就是这样......我想不出任何其他方法来做到这一点。

任何帮助将不胜感激。

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

4

0 回答 0