iOS中常用的多线程方案有GCD
和NSOperation
,至于NSThread
和pthread
基本不使用,下面简单介绍一下GCD
和NSOperation
的使用方法
一、GCD(Grand Central Dispatch)
GCD是苹果为多核的并行运算提出的解决方案,他使用的是C语言的语法,并且使用block,使得使用更灵活方便。
任务和队列
任务:就是你想要干什么,在GCD中就是一段block代码。任务分为同步任务sync
和异步任务async
同步任务
sync
会阻塞当前线程,当任务执行完成后才会继续执行当前线程
异步任务
async
不会阻塞当前线程,当前线程能继续执行
队列:存放任务的队列,分为串行队列
和并行队列
。
串行队列:遵循先进先出的原则,当一个任务执行完成后再执行下一个任务
并行队列:也是先进先出,不过一次取出多个任务放到不同线程执行,若要控制最大并发数可通过信号量
dispatch_semaphore_create
实现
创建队列
GCD提供了两个队列主队列
和全局队列
,我们也可以自己创建队列
主队列:主队列通过
dispatch_get_main_queue()
来获取。主队列用来刷新UI的,任何刷新UI的工作都需要放到主队列中,主队列是串行队列
全局队列:全局队列通过
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
来获取。这个队列是一个并行队列
自己创建队列:自己可以创建并行队列,也可以创建串行队列
//串行队列
dispatch_queue_create("Queue Name", NULL);
dispatch_queue_create("Queue Name", DISPATCH_QUEUE_SERIAL);
//并行队列
dispatch_queue_create("Queue Name", DISPATCH_QUEUE_CONCURRENT);
创建任务
- 同步任务:阻塞当前线程
dispatch_sync(<#dispatch_queue_t _Nonnull queue#>, ^{
//code
});
- 异步任务
dispatch_async(<#dispatch_queue_t _Nonnull queue#>, ^{
//code
});
其他常用的GCD方法
GCD还提供以下常用的方法
//单例
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
});
//延迟2秒执行
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
});
//阻塞式任务依赖
dispatch_barrier_sync(<#dispatch_queue_t _Nonnull queue#>, ^{
});
//非阻塞式任务依赖
dispatch_barrier_async(<#dispatch_queue_t _Nonnull queue#>, ^{
});
//创建任务组
dispatch_group_t group = dispatch_group_create();
//非阻塞式执行任务组中的任务,sync是阻塞式
dispatch_group_async(group, queue, ^{
});
//任务汇总
dispatch_group_notify(group, queue, ^{
});
dispatch_group_async_f
和dispatch_group_notify_f
参考文章:
关于iOS多线程,你看我就够了