iOS并发编程指南

最近又看了下官方关于并发编程的文档,简单做一下总结。

并发和程序设计

并发编程的几个概念:

-

并发:并发表示同时发生多件事情的概念

并行:并行是多个任务同时发生并且同时运行直到结束

-

同步:同步指函数运行时会阻塞当前线程一直运行结束

异步:异步指函数运行时不会阻塞当前线程

-

串行:当前队列中的任务是顺序执行的

并行: 当前队列中的任务是并发执行的,没有特定的顺序

-

并发的优点和缺点

优点:

•    充分发挥多核处理器优势,将不同线程任务分配给不同的处理器,真正进入“并行运算”状态
•    将耗时的任务分配到其他线程执行,由主线程负责统一更新界面会使应用程序更加流畅,用户体验更好
•    当硬件处理器的数量增加,程序会运行更快,而程序无需做任何调整

缺点:

增加了开销,并增加了整体的代码的复杂性,使得代码更难编写和调试

使用并发编程之前,你应该分解出可执行的工作单元,并确定你需要的队列。

Operation Queues

NSOperation是一个面向对象的方式来封装要异步执行的工作,被设计成结合操作队列(NSOperationQueue)使用,也可以自己单独使用

子类:

Target/Action 方式初始化

1
NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomethingWithObj:) object:nil];

Block方式初始化

1
2
3
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
//Do something here.
}];

所有的NSOperation对象支持以下特性:

1.设置依赖关系

2.设置完成块

3.使用KVO通知监听你的Operations执行状态改变

4.设置优先级

5.取消操作

自定义Operation(默认start为非并发)

1.继承NSOperation基类

2.至少实现下面两个方法:

initialization

main

3.其他可添加的方法

自定义的在主函数调用的方法

数据的存取方法

NSCoding协议的方法

并发执行的配置操作

1.重写isConcurrent函数并返回YES

2.重写start函数

3.重写isExecuting和isFinished函数

NSOperation属性列表

isCancelled 是否取消

isConcurrent 是否并发

isExecuting 是否正在执行

isFinished 是否已经完成

isReady 是否准备好要执行

dependencies(array) 依赖关系数组

queuePriority 优先级

completionBlock 完成块

优先级:

1
2
3
4
5
6
7
typedef NS_ENUM(NSInteger, NSOperationQueuePriority) {
NSOperationQueuePriorityVeryLow = -8L,
NSOperationQueuePriorityLow = -4L,
NSOperationQueuePriorityNormal = 0,
NSOperationQueuePriorityHigh = 4,
NSOperationQueuePriorityVeryHigh = 8
};

Dispatch Queues

串行队列(创建一个线程)

1
dispatch_queue_t sQueue = dispatch_queue_create("这是串行队列", NULL);

并发队列(创建多个线程)

1
dispatch_queue_t cQueue = dispatch_queue_create("这是并发队列", DISPATCH_QUEUE_CONCURRENT);

主队列

1
dispatch_queue_t mQueue = dispatch_get_main_queue();

后台队列

1
2
3
4
5
6
dispatch_queue_t gQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
#define DISPATCH_QUEUE_PRIORITY_HIGH 2
#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0
#define DISPATCH_QUEUE_PRIORITY_LOW (-2)
#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

异步执行

1
dispatch_async(dispatch_queue_t queue, dispatch_block_t block);

同步执行(不会开辟新的线程)

1
dispatch_sync(dispatch_queue_t queue, DISPATCH_NOESCAPE dispatch_block_t block);

以上可能有四种组合方式:

dispatch_sync + 串行队列 (串行执行)

dispatch_sync + 并发队列 (串行执行)

dispatch_async + 串行队列 (串行执行)

dispatch_async + 并发队列 (并行执行)

Dispatch Group

将多个任务放到这个组里面,可以在所有的任务都结束后得到一个回调。

dispatch_barrier_async + dispatch_queue_create()

使用时需要自己创建并发队列,不能使用后台队列。

dispatch_apply

和dispatch_sync一样,是同步运行的,会阻塞当前线程。

Dispatch Semaphore

可以根据自己需要创建需要的signal数量,如果只创建一个则为串行执行。

注意

循环引用

死锁

相关demo

- END -