GCD基础
一 GCD 与NSOperation
GCD -- (iOS4.0)多线程解决方案
将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
拿到dispatch_get_main_queue,线程之间的通信
NSOperation -- (iOS2.0) (后经苹果改造)
将操作添加到队列里
[NSOperationQueue mainQueue] 获取主队列,将任务添加到主队列,就会在主线程中执行
NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
可以暂停可以继续,也就是挂起操作
取消所有的任务
设置依赖关系
二 什么是GCD
GCD本身是苹果公司为多核的并发运算提出的解决办法,GCD工作时会自动利用更多的处理器核心,以充分利用更强大的机器.它是基于C语言的
如果使用GCD,完全由系统管理线程,我不需要手动编写线程代码,只需定义想要执行的任务,然后将其添加到适当的调度队列.GCD会负责创建线程,调度你的任务,系统直接提供线程管理
三创建
(1)//串行队列:一个一个执行
//同步操作:不开启新的线程
//执行结果:不开启新的线程,一个一个顺序执行
{
//label:队列名
//attr:队列属性(串行,并发)
//DISPATCH_QUEUE_SERIAL 串行
//DISPATCH_QUEUE_CONCURRENT 并发
//#define DISPATCH_QUEUE_SERIAL NULL
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL);
NSLog(@"开始");
//同步操作
//操作任务:block
dispatch_sync(queue, ^{
//打印当前线程
NSLog(@"%@",[NSThread currentThread]);
});
NSLog(@"结束");
}
(2)//串行队列:一个一个执行
//异步操作:会开启新的线程
//执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行
{
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL);
NSLog(@"开始");
for (NSInteger i = 0 ; i < 10; i ++ ) {
//异步请求
dispatch_async(queue, ^{
NSLog(@"%@,%@",[NSThread currentThread],@(i));
});
}
NSLog(@"结束");
}
(3)
//并发队列:多个线程同时执行
//异步操作:会开启新的线程
//执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行
//开启并发队列
{
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始");
for (NSInteger i = 0 ; i < 10; i ++ ) {
//执行异步操作
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
NSLog(@"结束");}
(4)
//并发队列:多个线程同时执行
//同步操作:不会开启新的线程
//执行结果:不会开启新的线程,立即执行
dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT);
NSLog(@"开始");
(5)
// 主队列就是一种特殊的串行队列
// 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行
{
dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"开始");
for (NSInteger i = 0; i < 10; i ++) {
//主队列执行异步操作,异步操作有一个等待的过程
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}
for (NSInteger i = 0 ; i < 10; i ++ ) {
dispatch_sync(queue, ^{
NSLog(@"%@,%@",[NSThread currentThread],@(i));
});
}
NSLog(@"结束");
}
(6)
//在主队列里执行同步操作,产生死锁
//原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。
{ dispatch_queue_t queue = dispatch_get_main_queue();
NSLog(@"1");
dispatch_sync(queue, ^{
NSLog(@"2");
});
NSLog(@"3");
}
(7)
//全局队列
//identifier 队列优先级
//flags 苹果预留的参数(没有用)
//DISPATCH_QUEUE_PRIORITY_DEFAULT 一般使用默认优先级
// dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//默认是并发队列,dispatch_get_global_queue用的多
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
for (NSInteger i = 0; i < 10; i++) {
//并发加异步
dispatch_async(queue, ^{
NSLog(@"%@",[NSThread currentThread]);
});
}