GCD的使用

来源:互联网 发布:深圳淘宝推广培训 编辑:程序博客网 时间:2024/05/23 13:08
// 核心概念:// 任务:block// 队列:把任务放到队列里面,队列先进先出的原则,// 串行队列:顺序,一个一个执行(必须一个任务执行完了,才能从队列里面取出下一个任务)// 并发队列:同时,同时执行很多个任务(可以同时取出很多个任务,只要有线程去执行)// 同步sync:不会开新线程// 异步async:会开新线程,多线程的代名词// 串行队列同步执行:不开线程,在原来线程里面一个一个顺序执行// 串行队列异步执行:开一条线程,在这个新线程里面一个一个顺序执行// 并发队列异步执行:开多个线程,并发执行(不一定是一个一个)执行// 并发队列同步执行:不开线程,在原来线程里面一个一个顺序执行// 阶段性总结:// 1. 开不开线程,由执行任务方法决定,同步不开线程,异步肯定开线程// 2. 开多少线程,由队列决定,串行 最多 开一个线程, 并发可以开多个线程。 具体开多少个,有GCD底层决定,程序猿不能控制- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {        [self gcdTest3];}#pragma GCDG演练/**  并发队列:可以同时执行多个任务  同步任务:不会开辟新线程,是在当前线程执行  结果:不开新线程,顺序一个一个执行。 */- (void)gcdTest4{        //1. 并行队列    dispatch_queue_t queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT);        // 2. 同步执行任务    for (int i = 0; i < 10; i++) {        dispatch_sync(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}/** 并发队列:可以同时执行多个任务 异步执行:肯定会开新线程,在新线程执行 结果:会开很多个线程,同时执行 */- (void)gcdTest3{    //1. 并行队列    dispatch_queue_t queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT);        // 2. 异步执行任务    for (int i = 0; i < 10; i++) {        dispatch_async(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}/** 串行队列:一个一个执行 异步执行:肯定会开新线程,在新线程执行 结果:只会开一个线程,而且所有任务都在这个新的线程里面执行 */- (void)gcdTest2{    // 1. 串行队列    // 下面两种写法是一样的//    dispatch_queue_t queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_SERIAL);    dispatch_queue_t queue = dispatch_queue_create("itcast", NULL);        // 2. 异步执行    for (int i = 0; i < 10; i++) {        dispatch_async(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }}/** 串行队列:顺序,一个一个执行 同步任务:不会开辟新线程,是在当前线程执行 结果:不开新线程,在当前线程顺序执行  dispatch : 调度,GCD里面函数,都是以dispatch开头的 */- (void)gcdTest1{    // 1. 创建一个串行队列    //参数:1. 队列标签 2. 队列的属性    dispatch_queue_t queue = dispatch_queue_create("itcast", DISPATCH_QUEUE_SERIAL);        NSLog(@"开始!!");    // 2. 同步执行任务    // 一般只要使用”同步“执行,串行队列对添加的同步任务,会立马执行    dispatch_sync(queue, ^{        NSLog(@"%@", [NSThread currentThread]);    });        NSLog(@"完成!!");}
/** 全局队列跟并发队列的区别 1. 全局队列没有名称 并发队列有名称 2. 全局队列,是供所有的应用程序共享。 3. 在MRC开发,并发队列,创建完了,需要释放。 全局队列不需要我们管理 */#pragma CGD - 全局队列- (void)gcdTest8{    // 获得全局队列    /**     参数:第一个参数,一般 写 0(可以适配 iOS 7 & 8)     iOS 7     DISPATCH_QUEUE_PRIORITY_HIGH 2  高优先级     DISPATCH_QUEUE_PRIORITY_DEFAULT 0  默认优先级     DISPATCH_QUEUE_PRIORITY_LOW (-2) 低优先级     DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN 后台优先级          iOS 8     QOS_CLASS_DEFAULT  0          第二个参数:保留参数 0     */    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);        // 添加异步任务    for (int i = 0; i < 10; i++) {        dispatch_async(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });    }    }#pragma GCD- 同步任务的作用- (void)gcdTest7{    // 并发队列    dispatch_queue_t  queue = dispatch_queue_create("cz", DISPATCH_QUEUE_CONCURRENT);        /**     例子:有一个小说网站     - 必须登录,才能下载小说          有三个任务:     1. 用户登录     2. 下载小说A     3. 下载小说B     */    // 添加任务    // 同步任务,需要马上执行。 不开新线程    dispatch_sync(queue, ^{        NSLog(@"用户登录 %@", [NSThread currentThread]);    });    //    dispatch_async(queue, ^{        NSLog(@"下载小说A %@", [NSThread currentThread]);    });    dispatch_async(queue, ^{        NSLog(@"下载小说B %@", [NSThread currentThread]);    });}#pragma GCD-主队列/**  主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程.  同步执行:要马上执行  结果:死锁 */- (void)gcdTest6{    // 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列    dispatch_queue_t queue = dispatch_get_main_queue();        NSLog(@"1----");        // 2. 同步执行任务    for (int i = 0; i < 10; i++) {        NSLog(@"调度前---");        // 同步:把任务放到主队列里,但需是马上执行        dispatch_sync(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });        NSLog(@"睡会");        [NSThread sleepForTimeInterval:2.0];    }    NSLog(@"完成----");}/** 主队列:专门负责在主线程上调度任务,不会在子线程调度任务,在主队列不允许开新线程. 异步执行: 会开新线程,在新线程执行 结果: 不开线程, 只能在主线程上面,顺序执行! */- (void)gcdTest5{    // 1. 获得主队列-> 程序启动,--> 至少有一个主线程-> 一开始就会创建主队列    dispatch_queue_t queue = dispatch_get_main_queue();        NSLog(@"1----");        // 2. 异步执行任务    for (int i = 0; i < 10; i++) {        NSLog(@"调度前---");        // 异步:把任务放到主队列里,但是不需要马上执行        dispatch_async(queue, ^{            NSLog(@"%@ %d", [NSThread currentThread], i);        });        NSLog(@"睡会");        [NSThread sleepForTimeInterval:2.0];    }    NSLog(@"完成----");}



- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {           dispatch_async(dispatch_get_global_queue(0, 0), ^{                NSLog(@"%@", [NSThread currentThread]);        // 耗时操作: 放在全局队列,异步执行        // 1. url, 确定一个网络上的资源路径        NSURL *url = [NSURL URLWithString:@"http://fe.topit.me/e/d1/12/1170068721aa112d1el.jpg"];                // 2. 通过url可以下载对应的网络资源, 网络资源传输的都是二进制        NSData *data = [NSData dataWithContentsOfURL:url];                // 3. 二进制转成图片        UIImage *image = [UIImage imageWithData:data];                // 4. 更新UI,在主线程-》 直接把任务添加到主队列,就会在主队列执行        dispatch_async(dispatch_get_main_queue(), ^{            self.iconView.image = image;            NSLog(@"-----%@", [NSThread currentThread]);        });    });    }


- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {    [self once];    }#pragma mark - 一次性执行- (void)once{    static dispatch_once_t onceToken;    NSLog(@"%ld", onceToken);        dispatch_once(&onceToken, ^{        NSLog(@"%----ld", onceToken);        NSLog(@"真的执行一次么?");    });    NSLog(@"完成");}#pragma mark - 调度组(分组)- (void)group{    /**     应用场景:     开发的时候,有的时候出现多个网络请求都完成以后(每一个网络请求的事件长短不一定),再统一通知用户                比如: 下载小说:三国演义, 红楼梦, 金X梅     */    // 实例化一个调度组    dispatch_group_t group = dispatch_group_create();        // 队列    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);        // 任务添加到队列queue    dispatch_group_async(group, queue, ^{        NSLog(@"下载小说A---%@", [NSThread currentThread]);    });        dispatch_group_async(group, queue, ^{        NSLog(@"下载小说B---%@", [NSThread currentThread]);    });        dispatch_group_async(group, queue, ^{        NSLog(@"下载小说X---%@", [NSThread currentThread]);    });        // 获得所有调度组里面的异步任务完成的通知//    dispatch_group_notify(group, queue, ^{//        NSLog(@"下载完成,请观看%@", [NSThread currentThread]); // 异步的//    });    //注意点: 在调度组完成通知里,可以跨队列通信    dispatch_group_notify(group, dispatch_get_main_queue(), ^{        // 更新UI,在主线程        NSLog(@"下载完成,请观看%@", [NSThread currentThread]); // 异步的    });}#pragma mark - 延时操作- (void)delay{    /**     参数:      now 0     NSEC_PER_SEC: 很大的数字         */    dispatch_time_t when = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC));        // 参数: when : 表示从现在开始,经过多少纳秒以后    // queue :  在哪一个队列里面执行后面的任务//    dispatch_after(when, dispatch_get_main_queue(), ^{//        NSLog(@"点我了-- %@", [NSThread currentThread]);//    });//        dispatch_after(when, dispatch_get_global_queue(0, 0), ^{        NSLog(@"点我了-- %@", [NSThread currentThread]);    });}



3 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 生完孩子腿关节疼怎么办 手指上长了倒刺怎么办 肥肉吃多了恶心怎么办 大便粘稠怎么回事还便秘怎么办 狗狗大便次数多怎么办 宝宝拉白色稀便怎么办 5个月宝宝流鼻涕怎么办 5个月婴儿流鼻涕怎么办 五个月宝宝流鼻涕鼻塞怎么办 4个月宝宝流鼻涕怎么办 大便经常是稀的怎么办 拉黑色的稀大便怎么办 孕晚期半夜饿了怎么办 肠胃不好大便不成型怎么办 螃蟹吃多了过敏怎么办 吃螃蟹过敏很痒怎么办 吃螃蟹喝啤酒了怎么办 1个月宝宝拉肚子怎么办 被雨林蝎子蛰了怎么办 在家被蜈蚣咬了怎么办 宝宝被蝎子蜇了怎么办 仓鼠只吃面包虫怎么办 套装但是装等低怎么办 被香港人骗了钱怎么办 被红头蛇咬了怎么办 爸妈吵架闹离婚怎么办 包包用酒精擦了怎么办 灰色泰迪毛发白怎么办 手被野猫抓伤了怎么办 想去香港玩两天怎么办 受凉了一直想吐怎么办 受寒后头晕想吐怎么办 肚子受凉了想吐怎么办 想吐但吐不出来怎么办 抽烟抽的牙黄怎么办 借了大耳窿的钱怎么办 5岁左眼视力不好怎么办 老公才30性不行怎么办 老婆出轨跑了怎么办啊 海螺吃多了头晕怎么办 读书的好与不好怎么办