创建队列
创建普通队列
第一个参数:C语言的字符串,标签
第二个参数:队列的类型
DISPATCH_QUEUE_SERIAL 串行队列
DISPATCH_QUEUE_CONCURRENT 并发队列
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
获得全局并发队列
第一个参数:优先级
第二个参数:此参数暂时无用,给未来使用,传0即可
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
使用Create函数创建的并发队列和全局并发队列的主要区别:
1.全局并发队列在整个应用程序中本身是默认存在的,并且对应有高优先级,默认优先级,低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用。而Create函数是实打实的从头开始去创建一个队列
2.在iOS6.0之前,在GCD中凡是使用了带Create和retain的函数在最后都需要做一次release操作。而住队列和全局并发队列不需要我们手动release。当然了,在iOS6.0之后,GCD已经被纳入到了ARC的内存管理范畴中,即便是使用retain或者create函数创建的对象也不再需要开发人员手动释放,我们像对待普通OC对象一样对待GCD就可以了
3.在使用栅栏函数的时候,苹果官方明确规定栅栏函数只有在和使用create函数自己的创建的并发队列一起使用的时候才有效(没有给出具体原因)
四种使用方式
异步函数+并发队列
开启多条线程,队列中任务异步执行
并不是多少个任务就开多少个线程
- (void)asyncConcurrent
{
// 1.创建队列
// dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
// 获得全局并发队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
// 2.1>封装任务 2.2>添加任务到队列中
/**
第一个参数:队列
第二个参数:要执行的任务
*/
dispatch_async(queue, ^{
NSLog(@"download1--- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download2--- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download3-- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download4-- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download5-- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download6-- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download7-- %@",[NSThread currentThread]);
});
}
异步函数+串行队列
会开启新线程,队列中任务是串行执行
- (void)asyncSerial
{
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
NSLog(@"download1--- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download2--- %@",[NSThread currentThread]);
});
dispatch_async(queue, ^{
NSLog(@"download3-- %@",[NSThread currentThread]);
});
}
同步函数+并发队列
不会开线程,任务是串行执行的
- (void)syncConcurrent
{
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
NSLog(@"download1--- %@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download2--- %@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download3-- %@",[NSThread currentThread]);
});
}
同步函数+串行队列
不会开线程,任务是串行执行的
- (void)syncSerial
{
dispatch_queue_t queue = dispatch_queue_create("download", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"download1--- %@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download2--- %@",[NSThread currentThread]);
});
dispatch_sync(queue, ^{
NSLog(@"download3-- %@",[NSThread currentThread]);
});
}
网友评论