如何放弃向阻塞的串行队列添加新操作

时间:2014-05-12 12:16:38

标签: objective-c multithreading grand-central-dispatch

根据" AVCaptureOutput.h" AVCaptureVideoDataOutputSampleBufferDelegate代表就是这样描述的。

  

如果在捕获新帧时阻止队列,那么这些帧   将在由值确定的时间自动删除   alwaysDiscardsLateVideoFrames财产。

如何实现类似的功能?因此,如果队列被阻止,我可以放弃新的操作 它是串行队列的默认行为吗?

1 个答案:

答案 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--;
            });
        }
    }
}