在处理请求时忽略对dispatch_async的调用

时间:2013-04-30 14:03:44

标签: ios multithreading grand-central-dispatch

我有一个iPhone应用程序,根据某些参数重新创建图像。由于此图像重新创建可能需要一些时间,因此我使用单独的线程来创建图像。

 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);

            // costly drawing

            UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
            dispatch_async(dispatch_get_main_queue(), ^{
                self.image = newImage;
            });
        });

影响此图像重新创建的参数变化的速度可能比重新创建图像的速度快,因此我希望在需要时“暂停”重新创建,并且一次只执行一次此类dispatch_async调用。

然后,随着更多重新创建图像的请求到达,只记住最后一个(具有最新参数),并且一旦图像重新创建,就为这些参数启动一个。

从未完成所有其他调用并不重要,无论如何都会覆盖图像。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

您可能需要考虑使用NSOperationQueue,因为每次添加新的队列项时都可以取消现有的队列项。

使用dispatch_async将运行块中的任何内容,直到完成(除非您挂起整个队列),这样就没有很好的方法可以在不设置某种取消标记的情况下停止先前的队列项(在这种情况下) ,它们只是短路但块仍然完成)。

NSOperationQueue构建于GCD之上,因此它提供了相同的后台功能,它只是让您可以更好地控制队列,这就是您在这种情况下所需要的。它也可以在多个线程上并发运行,但您不需要它。