我正在寻找一种方法来停止核心动画,直到我可以完成对核心图形的一些处理。我尝试了几种方法,但似乎没有任何效果。
背景:我需要做很多核心图形绘图。所有的处理都是在 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
是矫枉过正,但其他模式都没有工作。只是试图涵盖我所有的基础。
如果我可以访问运行核心动画的线程,也许我可以直接停止它,但我不确定如何访问该线程。
就是这样......我想不出任何其他方法来做到这一点。
任何帮助将不胜感激。
注意:我知道我可以在主线程上运行所有处理,但我正在寻找尽可能多的性能提升。同时处理核心图形代码确实加快了新设备上的速度。