iOS编程之GCD
在使用GCD之前先了解一下有哪些好处?
GCD可以多任务并行执行;可以更多地利用CPU资源;会自动管理线程的生命周期,程序员只需要告诉GCD要执行的任务,不需要程序员去手动管理;
GCD有四种模式:这里有同步和异步任务,还有串行和并行队列;
dispatch_queue_create(const char *_Nullable label,dispatch_queue_attr_t _Nullable attr);
方法创建一个队列,第一个参数是一个字符,第二个参数是创建串行队列还是并行队列,DISPATCH_QUEUE_CONCURRENT表示并行队列,DISPATCH_QUEUE_SERIAL表示串行队列;void
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);方法是同步任务;
dispatch_async(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);方法是异步任务;
1、同步+串行队列
创建一个串行队列:
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);
dispatch_sync(queue, ^{
NSLog(@"同步+串行队列=%@",[NSThread currentThread]);
这里打印线程为主线程main
})
2、异步+串行队列
dispatch_async(queue, ^{
NSLog(@"同步+串行队列=%@",[NSThread currentThread]);
这里打印线程创建了一个新子线程,这里添加多个任务的话为同一个子线程
})
3、同步+并行队列
创建一个并行队列:
dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);
dispatch_sync(queue, ^{
NSLog(@"同步+串行队列=%@",[NSThread currentThread]);
这里打印线程和主线程一样
})
4、异步+并行队列
dispatch_async(queue, ^{
NSLog(@"同步+串行队列=%@",[NSThread currentThread]);
这里打印线程创建了一个新子线程,这里如果添加多个任务的话就是多个子线程
})
最后在线程的使用中要注意线程死锁问题。线程死锁其实和循环引用比较类似,就是A等待B执行完,B等待A执行完,造成线程死锁。