iOS开发技术分享程序员iOS Developer

iOS多线程之GCD详解(看我就够了)

2017-07-05  本文已影响206人  zhangyajie

简介

任务和队列

执行任务

GCD中有2个用来执行任务的常用函数

队列的类型

GCD的队列可以分为2大类型

容易混淆的术语

创建队列

并发队列
串行队列

GCD中获得串行有2种途径

各种队列的执行效果

|并发队列| 手动创建的串行队列 | 主队列
---|----|------|----
同步(sync) | 没有开启新线程、串行执行任务 | 没有开启新线程、串行执行任务|没有开启新线程、串行执行任务
异步(async) | 有开启新线程、并发执行任务| 有开启新线程、串行执行任务|没有开启新线、串行执行任务

注意:

使用sync函数往当前串行队列中添加任务,会卡住当前的串行队列

线程间通信

//从子线程回到主线程
dispatch_async(
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    // 执行耗时的异步操作...
      dispatch_async(dispatch_get_main_queue(), ^{
        // 回到主线程,执行UI刷新操作
        });
});```



##### iOS常见的延时执行

//调用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后再调用self的run方法

使用GCD函数
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
// 2秒后执行这里的代码...
});

//使用NSTimer
[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(test) userInfo:nil repeats:NO];

#### 一次性代码

//使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
// 只执行1次的代码(这里面默认是线程安全的)
});

#### 快速迭代

//使用dispatch_apply函数能进行快速迭代遍历
dispatch_apply(10, dispatch_get_global_queue(0, 0), ^(size_t index){
// 执行10次代码,index顺序不确定
});

#### 队列组

//有这么1种需求
//首先:分别异步执行2个耗时的操作
//其次:等2个异步操作都执行完毕后,再回到主线程执行操作

//如果想要快速高效地实现上述需求,可以考虑用队列组
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执行1个耗时的异步操作
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
// 等前面的异步操作都执行完毕后,回到主线程...
});

#### 单例模式
- 单例模式的作用
可以保证在程序运行过程,一个类只有一个实例,而且该实例易于供外界访问
从而方便地控制了实例个数,并节约系统资源

- 单例模式的使用场合
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次)

//ARC中,单例模式的实现
//在.m中保留一个全局的static的实例
static id _instance;

//重写allocWithZone:方法,在这里创建唯一的实例(注意线程安全)

//实现copyWithZone:方法

上一篇 下一篇

猜你喜欢

热点阅读