2

我有一个 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 调用。

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

没关系,所有其他调用永远不会完成,无论如何图像都会被覆盖。

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

4

1 回答 1

2

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

Usingdispatch_async将运行您在块中放置的任何内容,直到完成(除非您暂停整个队列),因此没有设置某种取消标志的停止先前队列项目的好方法(在这种情况下,它们只是短路但该块仍在运行完成)。

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

于 2013-04-30T14:17:45.217 回答