GCD基础知识合集

GCD概念简单理解

GCD是基于C的Api。不需要自己管理线程生死。只需要创建队列,把任务放进队列里面就可以了。
GCD有两个核心概念。一个是任务,一个是队列。

同步执行和异步执行

同步函数:在当前线程中执行,不开启新的线程

dispatch_sync(dispatch_queue_t queue, dispatch_block_tblock);

异步函数:具备开启线程的能力。

dispatch_async(dispatch_queue_t queue, dispatch_block_tblock);
队列
并发队列

自动开启多个线程,并且可以让多个任务同时执行。
仅仅在异步函数(dispatch_async)下有效。

串行队列

让线程一个接着一个的执行。一条线程执行完后再执行下一条线程。

并发队列

并发队列不需要手动创建。以下是创建代码。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT// 队列的优先级
                                                       , 0);//unsignedlongflags此参数暂时无用,用0即可
全局并发队列的优先级
#defineDISPATCH_QUEUE_PRIORITY_HIGH 2 // 高
#defineDISPATCH_QUEUE_PRIORITY_DEFAULT 0 // 默认   (中)
#defineDISPATCH_QUEUE_PRIORITY_LOW (-2)// 低
#defineDISPATCH_QUEUE_PRIORITY_BACKGROUND       
INT16_MIN // 后台

串行队列

使用dispatch_queue_create函数创建串行队列
dispatch_queue_create(constchar*label, //队列名称
dispatch_queue_attr_tattr);//队列属性,一般用NULL即可
dispatch_queue_t queue = dispatch_queue_create("isQueue", NULL);//创建
dispatch_release(queue);//非ARC时候需要释放手动创建的队列

使用主队列(跟主线程相关联的队列)
主队列是GCD自带的一种特殊的串行队列
放在主队列中的任务,都会放到主线程中执行
使用dispatch_get_main_queue()获得主队列
dispatch_queue_t queue = dispatch_get_main_queue();

使用dispatch_sync同步函数时候,在主线程中往主队列添加任务会造成死锁。

队列与任务的结合

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

线程间的通讯

更新UI,数据等都是要回到主线程的。不能在子线程。

//获取全局队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
    NSLog(@"-子线程-- 开始下载图片--%@",[NSThread currentThread]);
    //下载数据是耗时操作放到子线程
    UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://b.hiphotos.baidu.com/image/pic/item/b219ebc4b74543a94369f4cb1c178a82b9011442.jpg"]]];

        dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"-主线程-- 刷新UI--%@",[NSThread currentThread]);
        //回到主线程刷新UI
        self.imageView.image = image;
    });
});

你可能感兴趣的:(GCD基础知识合集)