2013-04-30 29 views
2

我有一个基于某些参数的iPhone应用程序,图像被重新创建。由于此图像重新创建可能需要一些时间,因此我使用单独的线程来创建图像。忽略正在处理请求时调用dispatch_async

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电话。

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

无论如何,所有其他调用都不会影响,图像将被覆盖。

达到此目的的最佳方法是什么?

+0

NSOperation和NSOperationQueue怎么样?添加操作,并取消正在进行的操作? – TheBlack 2013-04-30 14:17:33

+0

您是否尝试过使用串行GCD队列而不是全局并行队列? – yaakov 2013-04-30 14:41:19

回答

2

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

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

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

+0

正是我所寻找的,像一个魅力的作品,谢谢 – Pieter 2013-05-02 08:32:44

+0

不客气! – iwasrobbed 2013-05-02 12:39:16