Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何放弃向阻止的串行队列添加新操作_Objective C_Multithreading_Grand Central Dispatch - Fatal编程技术网

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

Objective c 如何放弃向阻止的串行队列添加新操作,objective-c,multithreading,grand-central-dispatch,Objective C,Multithreading,Grand Central Dispatch,根据“AVCaptureOutput.h”,对AVCaptureVideoDataOutputSampleBufferDelegate委托的描述如下 如果捕获新帧时队列被阻塞,则这些帧 将在由 alwaysDiscardsLateVideoFrames属性 如何实现类似的功能?因此,如果队列被阻塞,我可以放弃新操作。 这是串行队列的默认行为吗 此“如果队列仍在运行前一个块,则不分派新块”绝对不是默认行为。如果您想这样做,您可以编写自己的分派例程,在添加新的分派例程之前检查是否有正在运行的操作 如

根据“AVCaptureOutput.h”,对
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很容易。我是那样做的。