GCD高级功能(一次性执行,调度组,延迟操作)

GCD的三大高级功能:一次性执行,调度组,延迟操作
一次性执行
一次性执行 : 可以保证某一段代码在程序运行的过程中只被执行一次
一次性执行是线程安全的,在多线程环境下也是只执行一次
应用场景 : 设计单例模式.(效率比互斥锁高)
可以保证程序在运行的过程中,一个类有且只有一个实例化的对象,而且该对象易于供外界访问
可以节省内存资源

/// 验证安全性 : 线程安全
- (void)onceDemo2
{
    for (int i = 0; i < 1000; i++) {

        NSLog(@"点击屏幕.....");

        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            static dispatch_once_t onceToken;
            dispatch_once(&onceToken, ^{
                NSLog(@"hello");
            });
        });
    }
}

/// 一次性执行 : 保证代码制备执行一次
- (void)onceDemo1
{
    NSLog(@"点击屏幕....");

    static dispatch_once_t onceToken;

    // 原理 : 第一次执行时候,onceToken的初始值是0.当检测到初始值是0的时候,就执行一次性执行的代码.执行完成之后,将onceToken的初始值设置为非零的.

    NSLog(@"%ld",onceToken);

    dispatch_once(&onceToken, ^{
        NSLog(@"hello");
    });
}

单例设计模式
声明一个类.h文件

#import <Foundation/Foundation.h>
@interface AppUntil : NSObject

/// 实例化的类方法
+ (instancetype)sharedAppUntil;

- (void)loadData;

@end

类的.m文件

#import "AppUntil.h"

/*
 1. 有一个供全局实例化的方法
 2. 在内存中有且只有一个实例化的对象
 3. 生命周期跟应用程序一样长
 */

@implementation AppUntil

+ (instancetype)sharedAppUntil
{
    static AppUntil *instance;

    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[AppUntil alloc] init];
    });

    return instance;
}

- (void)loadData
{
    NSLog(@"下载中.....");
}

单例的应用:

- (void)viewDidLoad {
    [super viewDidLoad];
    //创建三个对象--这种创建的三个对象,是三个不同的对象,开辟了三个空间
    AppUntil *until1 = [[AppUntil alloc] init];
    NSLog(@"%@",until1);
    AppUntil *until2 = [[AppUntil alloc] init];
    NSLog(@"%@",until2);
    AppUntil *until3 = [[AppUntil alloc] init];
    NSLog(@"%@",until3);
}

这里写图片描述

   三个地址一样
    AppUntil *until1 = [AppUntil sharedAppUntil];
    NSLog(@"%@",until1);
    AppUntil *until2 = [AppUntil sharedAppUntil];
    NSLog(@"%@",until2);
    AppUntil *until3 = [AppUntil sharedAppUntil];
    NSLog(@"%@",until3);

    [[AppUntil sharedAppUntil] loadData];

这里写图片描述
调度组
调度组特点 : 一组异步任务执行结束之后,我们能够得到统一的通知
比如下载一组图片,等所有的图片都下载完毕之后 转到 主线程更新UI.
调度组原理
调度组原理

//1 全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
    //2 调度组
    dispatch_group_t group = dispatch_group_create();
    //3 添加任务
    //把任务添加到队列,等任务执行完成之后通知调度组
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载图片1  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载图片2  %@",[NSThread currentThread]);
    });
    dispatch_group_async(group, queue, ^{
        NSLog(@"下载图片3  %@",[NSThread currentThread]);
    });
    //4 所有任务都执行完成后,获得通知 (异步执行)
    //等调度组中队列的任务完成后,把block添加到指定的队列
//    dispatch_group_notify(group, queue, ^{
//        NSLog(@"OK %@",[NSThread currentThread]);
//    });

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
//更新UI控件,提示用户
        NSLog(@"OK %@",[NSThread currentThread]);
    });
    NSLog(@"over");

调度组原理

在终端中 输入man dispatch_group_async
//1 全局队列
    dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    //2 调度组
    dispatch_group_t group = dispatch_group_create();

    //ARC中不用写
//    dispatch_retain(group);
    //3 进入调度组,执行此函数后,再添加的异步执行的block都会被group监听
    dispatch_group_enter(group);

    //4 添加任务
    dispatch_async(queue, ^{
        NSLog(@"!!--!!");
        dispatch_group_leave(group);
        //ARC中此行不用写,也不能写
//        dispatch_release(group);
    });
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        NSLog(@"!!------!!");
        dispatch_group_leave(group);
        //ARC中此行不用写,也不能写
        //dispatch_release(group);
    });

    //5  获得调度组的通知
    dispatch_group_notify(group, dispatch_get_main_queue(), ^{
        NSLog(@“OK %@",[NSThread currentThread]);
    });
//6 等待调度组 监听的队列中的所有任务全部执行完毕,才会执行后续代码,会阻塞线程(很少使用)
    dispatch_group_wait(group, DISPATCH_TIME_FOREVER);

延迟操作

/延时操作
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{


    });

•   dispatch_after的定义
dispatch_after(dispatch_time_t when,
dispatch_queue_t queue,
dispatch_block_t block);
 •  dispatch_after的参数
参数1  dispatch_time_t when
多少纳秒之后执行
参数2  dispatch_queue_t queue
任务添加到那个队列
参数3  dispatch_block_t block
要执行的任务
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值