这与objective-c中使用的Grand Central Dispatch API有关,具有以下代码:
dispatch_queue_t downloadQueue = dispatch_queue_create("other queue", NULL);
dispatch_async(downloadQueue, ^{
....some functions that retrieves data from server...
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"got it");
});
});
dispatch_release(downloadQueue);
我目前对队列如何工作的理解是队列中的块将进入该队列的线程。所以两个队列将成为两个线程。使用多线程,这两个队列将同时发生。 但是,当程序收到数据时,“得到它”就出现了。这是怎么发生的?
请指出您是否要更正或添加我对线程和队列的理解。
答案 0 :(得分:5)
因此两个队列将成为两个线程。
不一定。 GCD的一个优点是系统根据可用CPU核心数量和其他因素动态决定它创建的线程数。很可能两个自定义队列在同一个后台线程上执行,特别是如果两个队列中的任务很少等待执行。
您唯一可以确定的是,串行队列永远不会同时使用多个线程。因此,您添加到同一(串行)队列的任务将始终按顺序执行。对于使用dispatch_get_global_queue()
获得的三个并发全局队列,情况并非如此。
此外,主队列(您使用dispatch_get_main_queue()
访问的队列)始终绑定到主线程。它是唯一一个在程序的主线程上执行任务的队列。
在您的示例中,downloadQueue
的任务在后台线程上执行。一旦代码到达dispatch_async(dispatch_get_main_queue(), ^{
,GCD就会将这个新任务推送到主线程,在主线程中,如果主线程不忙于其他事情,它将立即执行。