再次学习GCD

Posted 徒步阳光

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了再次学习GCD相关的知识,希望对你有一定的参考价值。

在cocoachina上看到一篇文章,今天学下。

一、任务

任务:线程中那个执行的代码段。

执行任务分为两种:

1.sync(同步):等待队列的任务执行结束

dispatch_sync(dispatch_queue_t,^{

//执行代码  

});

NSLog(@"hello,sync");

直白说就是:代码自行到dispatch_sync(),会执行Block块---blockSync(形参),

blockSync执行结束后,执行NSLog,输出hello,sync!!!!

2.async(异步):开启新线程

dispatch_async(dispatch_queue_t,^{

//执行代码 

});

NSLog(@"hello,async");

直白说就是:代码执行到dispatch_async();会直接执行NSLog,输出hello,async!!!

然后异步执行BlockL块blockAsync;

二、队列----特殊的线性表,FIFO

1.Serial Dispatch Queue(串行队列)

一个接一个,五个一个窗口排队买票

1.1创建方法

1. dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_SERIAL);

2. 主队列

dispatch_queue_t queue = dispatch_get_main_queue();

2.Concurrent Dispatch Queue(并发队列)

一起执行,五个人五个窗口买票

2.1创建方法

1. dispatch_queue_t queue = dispatch_queue_create("net.bujige.testQueue", DISPATCH_QUEUE_CONCURRENT);

2. 全局并发队列

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

三、其他方法

3.1  GCD 栅栏方法:dispatch_barrier_async

在执行完栅栏前面的操作之后,才执行栅栏操作,最后再执行栅栏后边的操作

3.2  GCD 延时执行方法:dispatch_after

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(),^{

//延迟2s

});

3.3   GCD 一次性代码(只执行一次):dispatch_once

单例创建

3.4  GCD快速迭代方法:dispatch_apply

3.5  GCD队列组:dispatch_group/dispatch_group_notify/dispatch_group_wait

3.5.3 GCD    dispatch_group_enter/dipatch_group_leave

3.6  GCD信号量  dispatch_semaphore

3.6.1  Dispatch Semaphore线程同步

3.6.2 Dispatch Semaphore线程安全和线程同步(为线程加锁)

3.6.2.1 非线程安全(不使用 semaphore)

3.6.2.2 线程安全(使用semaphore加锁)

    

以上是关于再次学习GCD的主要内容,如果未能解决你的问题,请参考以下文章

[OC学习笔记]GCD复习

[OC学习笔记]GCD复习

iOS GCD学习笔记

关于多线程之GCD的一些学习要点

Cocoa深入学习:NSOperationQueueNSRunLoop和线程安全 (转)

[OC学习笔记]多线程之GCD