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

标签 objective-c multithreading cocoa-touch ios9 grand-central-dispatch

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

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

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

dispatch_async(backgroundQueue, ^{

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

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

最佳答案

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

    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 的返回值以查看您是否超时,然后创建一个新队列或等待队列空闲等。

关于objective-c - 检查调度队列是否跟不上任务并积压,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34935316/

相关文章:

c# - 根据用户请求在后台生成文件

iphone - 让 UITableView 转到顶行

iphone - 更改 View 时 ASIHTTPRequest 异步崩溃

ios - 删除 UICollectionView 底部的插入间距

ios - 显示 UIAlertController 时出现 UIViewControllerHierarchyInconsistency 异常

ios - 如何在 Objective-C 中按下第一个按钮时显示第二个按钮

ios - 反射(reflect)按钮标题(Objective-C)

objective-c - 具有多个条件的“if”语句

java - 通过 ExecutorCompletionService 执行时任务是否并行化?

c# - 从另一个线程中操作 UI 元素