我有一个 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调用。
然后,随着更多重新创建图像的请求到达,只记住最后一个(具有最新的参数),并且图像重新创建完成后立即为这些参数启动一个请求。
所有其他调用从未完成并不重要,图像无论如何都会被覆盖。
实现这一目标的最佳方法是什么?
最佳答案
您可能需要考虑使用 NSOperationQueue
,因为每次添加新队列项目时您都可以取消现有队列项目。
使用dispatch_async
将运行您在 block 中放置的任何内容,直到完成(除非您暂停整个队列),因此没有一个很好的方法可以在不设置某种取消标志的情况下停止先前的队列项目(在这种情况下,它们只是短路,但 block 仍然运行完成)。
NSOperationQueue
构建在 GCD 之上,因此它提供了相同的后台功能,它只是让您对队列有更多的控制,这正是本例中您所需要的。它也可以在多个线程上同时运行,但您不需要这样做。
关于ios - 处理请求时忽略对dispatch_async的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16301881/