1.GCD介绍
GCD:Grand Central Dispathch,核心*调度,是一种异步技术。但是它是系统级的。
负责管理队列,是线程之上的抽象层。队列可以并行或串行运行,能够在系统级自动管理和优化线程。把任务放到队列里执行,一个任务可以是一个函数或一个block。
1.1.多线程分类
以下的抽象度和底层函数级别从低到高。
1.1.1. PThread
已经抛弃了
1.1.2. NSThread
几乎不用
1.1.3. NSOperation
多用于网络下载,但是现在都用开源库,例如:AFNetWorking
1.1.4. GCD
多用于本地解析数据。
1.2. GCD概念说明
GCD中的队列称之为 dispatch queue,分类为三类:
1.2.1. main dispatch queue
- 系统提供
- 主线程
- 全局性的
- serial queue,串行,同一时间只能执行一个任务。
- 用途:UI操作相关,主线程执行。
- 用法:宏 dipatch_get_main_queue()
1.2.3. global dispatch queue
- 系统提供
- 并发执行
- 用法:函数 dispatch_get_global_queue(0,0),第一个参数为优先级,第二个参数现在没有意义,都是0。
1.2.3. 自定义的 dispatch queue
- 同时只能执行一个任务
- 用途:用于同步访问特定的资源
- 实时性没有太高要求的
- 函数:dispatch_queue_create("SerialQueue", DISPATCH_QUEUE_SERIAL);
2. GCD使用
2.1. 同步提交
- void dispath_sync(dispatch_queue_t queue, dispatch_block_t block);
- 阻塞线程
- Demo
- (void)syncDownload{
//同步下载,阻塞主线程
NSURL *url = [NSURL URLWithString:@""];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
UIImage *image = [[[UIImage alloc] initWithData:data] autorelease];
_imageView.image = image;
}
2.2. 异步提交
- void dispath_async(dispatch_queue_t queue, dispatch_block_t block);
- 后台执行
- Demo
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, ), ^{
//耗时的操作
NSURL *url = [NSURL URLWithString:@""];
NSData *data = [[[NSData alloc] initWithContentsOfURL:url autorelease];
UIImage *image = [[[UIImage alloc] initWithData:data] autorelease]; dispatch_async(dispatch_get_main_queue(),^{
//更新界面
_imageView.image = image;
});
});