Objective c 如何放弃向阻止的串行队列添加新操作
根据“AVCaptureOutput.h”,对Objective c 如何放弃向阻止的串行队列添加新操作,objective-c,multithreading,grand-central-dispatch,Objective C,Multithreading,Grand Central Dispatch,根据“AVCaptureOutput.h”,对AVCaptureVideoDataOutputSampleBufferDelegate委托的描述如下 如果捕获新帧时队列被阻塞,则这些帧 将在由 alwaysDiscardsLateVideoFrames属性 如何实现类似的功能?因此,如果队列被阻塞,我可以放弃新操作。 这是串行队列的默认行为吗 此“如果队列仍在运行前一个块,则不分派新块”绝对不是默认行为。如果您想这样做,您可以编写自己的分派例程,在添加新的分派例程之前检查是否有正在运行的操作 如
AVCaptureVideoDataOutputSampleBufferDelegate
委托的描述如下
如果捕获新帧时队列被阻塞,则这些帧
将在由
alwaysDiscardsLateVideoFrames
属性
如何实现类似的功能?因此,如果队列被阻塞,我可以放弃新操作。这是串行队列的默认行为吗 此“如果队列仍在运行前一个块,则不分派新块”绝对不是默认行为。如果您想这样做,您可以编写自己的分派例程,在添加新的分派例程之前检查是否有正在运行的操作 如果使用
NSOperationQueue
,则可以利用现有的operationCount
属性
- (void)addOperationIfQueueEmptyWithBlock:(void (^)(void))block
{
@synchronized (self) {
if (self.queue.operationCount == 0)
[self.queue addOperationWithBlock:block];
}
}
如果使用GCD,您只需维护自己的count属性:
@property (atomic) NSInteger operationCount;
然后:
- (void)dispatchAsyncTaskIfQueueEmpty:(void (^)(void))block
{
@synchronized (self) {
if (self.operationCount == 0) {
self.operationCount++;
dispatch_async(self.queue, ^{
block();
self.operationCount--;
});
}
}
}
谢谢你的回复。使用NSOperationQueue很容易。我是那样做的。