2013-07-06 27 views
0

有一个按钮的方法:dispatch_queue名称和线程

-(void) buttonTapped:(id) sender{ 
    dispatch_async(dispatch_queue_create("countQueue", NULL), ^{ 
     sleep(10); 
     NSLog(@"%d",self.count++); 
    }); 
} 

self.count是属性:

@property (nonatomic, assign) int count; 

我想知道如果我创建通过点击按钮,在“countQueue”很多次,

  1. 有多少线程正在运行以处理countQueue任务?
  2. 因为块需要在10秒内运行,如果每隔2秒点击一下按钮,那么它会创建一个新的队列,系统如何处理以前的任务?只要取消它?
+1

为什么你想使用GCD呢?为什么不断创建新的队列? – Wain

+0

情况就好像我点击一个按钮,应用程序应该从服务器下载一个图像,这将需要10秒 – NOrder

+0

如果您正在下载图像[AFNetworking](https://github.com/AFNetworking/AFNetworking)或[SDWebImage ](https://github.com/rs/SDWebImage)让你的生活更轻松,优雅,异步,缓存等。使用它们各自的'UIImageView'类别和删除你自己的异步图像检索代码可能会使很多的意义。 – Rob

回答

6
  • dispatch_queue_create()每次调用创建一个新队列,即使与同标号队列已经存在。该标签仅用于在调试期间识别队列的工具。任意多个具有相同标签的队列可以同时存在。
  • 由于您没有对队列保持强有力的引用,因此在分派到队列的所有块完成之后它会自动销毁。
  • 系统如何将线程分配给队列是GCD的实现细节。
  • 就你而言,它可能更容易使用dispatch_after()

编辑:阅读您的评论之后,我认为有一个更好的解决您的问题,如更新属性 如果图像下载真正完成。如何做到这一点取决于用于下载的方法。一个例子是NSURLConnectionsendAsynchronousRequest:queue:completionHandler:的完成处理程序 。

+0

真棒,非常感谢你! – NOrder