根据" AVCaptureOutput.h" AVCaptureVideoDataOutputSampleBufferDelegate
代表就是这样描述的。
如果在捕获新帧时阻止队列,那么这些帧 将在由值确定的时间自动删除
alwaysDiscardsLateVideoFrames
财产。
如何实现类似的功能?因此,如果队列被阻止,我可以放弃新的操作 它是串行队列的默认行为吗?
答案 0 :(得分:1)
如果队列仍在运行上一个块,则“不调度新块”绝对不是默认行为。如果您想这样做,您可以编写自己的调度例程,在添加新操作之前检查是否有运行的操作。
如果使用NSOperationQueue
,您可以利用现有的operationCount
属性。
- (void)addOperationIfQueueEmptyWithBlock:(void (^)(void))block
{
@synchronized (self) {
if (self.queue.operationCount == 0)
[self.queue addOperationWithBlock:block];
}
}
如果使用GCD,您只需维护自己的计数属性:
@property (atomic) NSInteger operationCount;
然后:
- (void)dispatchAsyncTaskIfQueueEmpty:(void (^)(void))block
{
@synchronized (self) {
if (self.operationCount == 0) {
self.operationCount++;
dispatch_async(self.queue, ^{
block();
self.operationCount--;
});
}
}
}