我正在使用GPUImage框架,我注意到编译器会自动跳过setColorAverageProcessingFinishedBlock括号内的所有内容。它完全跳过这些内容并继续执行,执行代码中的其他所有内容。一旦执行了其他所有操作,它将返回括号内的内容。显然,这会产生意想不到的副作用。
playerName
我该如何解决这个问题?
答案 0 :(得分:3)
上述代码存在两个问题:内存管理问题,以及对块如何工作的误解。
首先,您在方法中创建GPUImageVideoCamera实例,但不将其保留为实例变量。我将假设这是使用自动引用计数的代码,如果这是真的,则在您的方法完成后,此相机实例将被释放。充其量,在取消分配之前,您可以从相机捕获一帧。在最坏的情况下,这会在相机和连接到它的整个过滤器链在运行中解除分配时崩溃。
在包含的类上创建一个实例变量,并将GPUImageVideoCamera实例分配给它,使其持续时间足够长。
上面的第二个问题是对如何以及何时执行块的误解。块只是你可以传递的代码段,它们不一定与周围的其余代码串行执行。
在这种情况下,您提供的块是一个回调,将在通过平均颜色操作处理每一帧视频后触发。此处理在后台队列上异步进行,您必须设计代码以确认这一点。
如果要构建X值,请将每个测量值添加到该块内的数组中,然后在块中检查是否要达到X值。在这一点上,平均并与他们做任何事情。基本上,在块中添加一个检查并将其后的代码移动到块中,以便在计数大于X时运行。您可能希望在此时停止相机捕获,如果这就是您所需要的。
答案 1 :(得分:2)
您发布的代码完全按照预期的方式工作。颜色平均处理需要一段时间,因此它在后台线程上完成,因此主线程不会停止。处理完成后,然后调用该块。
任何在处理完成之前都不应执行的代码需要在内部块中执行。