dispatch_queue名称和线程

NOr*_*der 0 grand-central-dispatch ios

有一个按钮方法:

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

self.count是属性:

@property (nonatomic, assign) int count;
Run Code Online (Sandbox Code Playgroud)

我想通过点击按钮多次创建"countQueue",

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

Mar*_*n R 6

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

编辑:在阅读您的评论后,我认为您的问题有更好的解决方案,例如在图像下载实际完成时更新属性.如何执行此操作取决于下载使用的方法.一个例子是完成处理sendAsynchronousRequest:queue:completionHandler:NSURLConnection.