Pro*_*ber 56 iphone concurrency grand-central-dispatch ios
在其他一些方面,有以下两种方式来获取队列GCD
:
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_get_main_queue();
Run Code Online (Sandbox Code Playgroud)
如果我没有完全错误,"主队列"正在主线程上执行,并且适用于执行UI工作的"回调"块.
这是否意味着"全局队列"是在后台线程上运行的?
mat*_*way 77
主队列确实像你说的那样在主线程上运行.
全局队列是并发队列,并且来自dispatch_get_global_queue的主页面:
与使用dispatch_queue_create()分配的主队列或队列不同,一旦线程可用,全局并发队列就会调度块("非FIFO"完成顺序).全局并发队列代表三个优先级带:
Run Code Online (Sandbox Code Playgroud)• DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW
提交到高优先级全局队列的块将在提交到默认或低优先级全局队列的块之前调用.只有在默认或高优先级队列中没有待处理的块时,才会调用提交到低优先级全局队列的块.
因此,它们是在后台线程上运行的队列,当它们可用时.它们是"非FIFO",因此无法保证订购.
jjr*_*ott 27
5个队列(4个背景,1个主要)都有不同的线程优先级(-[NSThread threadPriority]
):
-main- : 0.758065
DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000
Run Code Online (Sandbox Code Playgroud)
(在iPod 4th gen和MacBook Pro上的模拟器上测试过)
是.您可以在设备上运行这样的代码来测试它:
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSLog(@"Block 1a");
NSAssert(![NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 1b");
});
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Block 2a");
NSAssert([NSThread isMainThread], @"Wrong thread!");
NSLog(@"Block 2b");
});
});
Run Code Online (Sandbox Code Playgroud)
全局调度队列:
主调度队列:
归档时间: |
|
查看次数: |
35322 次 |
最近记录: |