多线程详解之GCD

1.GCD延迟执行

<pre name="code" class="objc">#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]);
    });
}

2.GCD的一次执行操作

 
<pre name="code" class="objc">#pragma mark - 一次性执行
- (void)once
{
    static dispatch_once_t onceToken;
    NSLog(@"%ld", onceToken);
    
    dispatch_once(&onceToken, ^{
        NSLog(@"%----ld", onceToken);

        NSLog(@"真的执行一次么?");
    });
    NSLog(@"完成");

}

3.GCD调度组

 
<pre name="code" class="objc">#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]); // 异步的
    });
}

4.基本用法

 

<pre name="code" class="objc">//
//  ViewController.m
//  05-GCD的使用
//
//  Created by apple on 15-1-14.
//  Copyright (c) 2015年 apple. All rights reserved.

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

// 核心概念:
// 任务: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(@"完成!!");
}

@end



                
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值