检查调度队列是否跟不上任务并积压

Check if a dispatch queue cannot keep up with tasks and is backlogged

我正在使用串行调度队列来更改来自相机的延时视频应用程序的图像。到目前为止,我正在使用 GCD 将图像处理卸载到第二个线程。

我希望该应用 运行 运行很长时间,并且不想让设备因处理请求而不知何故不堪重负。

有没有办法检查调度队列是否跟不上添加到它的操作数(创建积压)?

dispatch_async(backgroundQueue, ^{

    __block UIImage* backupImage = self.thermalImage;
    backupImage = [self imageByDrawingCircleOnImage:backupImage];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self.thermalImageView setImage:backupImage];
    });
});

在确定队列积压之前,您是否有特定数量的任务要在此队列中执行?如果是这样,请使用 semaphore 来限制队列中的任务数。

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(3);
    dispatch_queue_t queue = dispatch_queue_create("com.foo.queue", DISPATCH_QUEUE_CONCURRENT);

    for(int i = 1; i < 7; i++) {
        dispatch_async(queue, ^{
            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
            NSLog(@"hello from #%d", i);
            [NSThread sleepForTimeInterval:2];
            dispatch_semaphore_signal(semaphore);
        });
    }

您可以指定一个超时时间,然后检查 dispatch_semaphore_wait 的 return 值以查看您是否超时,然后创建一个新队列或等待队列空闲等