再次学习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加锁)

    

原文地址:https://www.cnblogs.com/tom2015010203/p/8590907.html

时间: 2024-08-05 10:35:58

再次学习GCD的相关文章

再次学习快速排序

  快速排序已经看过好几遍了,经常因为小的bug,写错程序,为了以后少犯类似的错误,在这记下来. 快速排序的原理比较简单,运用递归的思想,每次用一个元素将原来的数组进行分割,关键是找对分割的位置.将前后两部分分割成小于分割元素和大于分割元素,然后递归对前后两部分继续快速排序 两部分代码: 第一部分是快速排序的整体思想: public static void quicksort(int[] list){ quicksort(list,0,list.length-1); } private stat

再次学习javascript中的参数传递

javascript中的所有函数的参数传递都是按照值传递的,做了下面测试: function addTen(num){ num +=10; return num; } var count = 20; var result = addTen(count); alert(cont); //20 alert(result); //30 好吧,上面只是做了基本类型的传递,再做个引用类型的传递看看: function setName(obj){ obj.name="Mark"; } var pe

yii学习 再次学习

记得去年夏天第一次接触yii,不经意间就过去了一年,再次看yii.这一年发生了很多事,停顿了好久,做了好多别的事. 不过回头看看,我好像是很慢的那种 我的学习程度估计还没有那四个月的感觉...继续努力

带你系统学习GCD(三)

个人博客主站欢迎访问有系统GCD学习整合资料. dispatch_suspend / dispatch_resume 当使用Dispatch Queue 进行复杂处理的时候,有的时候希望不执行已追加的处理. 这种情况下可以挂起Dispatch Queue就可以, 当需要他执行的时候在执行恢复 // 挂起(可以理解为暂停) dispatch_suspend(queue); // 恢复 dispatch_resume(queue); dispatch_once 函数是在应用程序执行中只执行一次指定处

Spring再次学习(4)

时隔一年多,在掌握了Spring.SpringBoot.SpringCloud之后 我再次回头,重新学习Spring框架 Bean的生命周期学习: 在传统的XML配置中,可以这样自定义初始化和销毁方法: init-method="" destroy-method="" 注解方式的简单使用: @Configuration public class LifeCircleConfig { @Bean(initMethod = "init",destro

带你系统学习GCD(一)

欢迎走进夏天的Coding世界. 今天分享的关于GCD的知识, 对于GCD的说明: 开发者要做的知识定义想要执行的任务并对家到适当的Dispatch Queue中. 存在两种Dispatch Queue 见下表 Dispatch Queue的种类 说明 Serial Dispatch Queue 等待现在执行中处理结束 Concurrent Dispatch Queue 不等待现在执行中处理结束 Serial Dispatch Queue 使用一个线程 Concurrent Dispatch Q

2014.10.5 再次学习LINUX

mesg 发送信息给root y n write/talk 写消息给 wall 给所有用户发送消息 ps -aux ps -elF pstree 命令行跳转:CTRL+a行首 CTRL+e行尾 CTRL+u清除光标左侧至开头 CTRL+k清除光标右侧至结尾 CTRL+左右键 history -c 清除所有命令 history -d 500 10 从第500个历史开始 删除10个命令记录 tr 'a-z' 'A-Z' 替换命令 wc -l grep --color -i -v显示没有被模式匹配到的

MVC再次学习1

1.0 匿名函数和匿名类: internal delegate int AddDel(int a, int b); //泛型委托 delegate T Demo<T>(int a,int b); delegate T Demo2<T,T1>( T1 a, int b); //Func Action 区别:Action就是没有返回值 Func有返回值 ,传人参数一共有16个 class Program { static void Main(string[] args) { #regi

再次学习快速排序(C语言)

#include <stdio.h> void QuickSort1(int *s,int left,int right) { int i,j,t,pivot; if(left>right) return; if(left<right) { pivot = s[left]; //基准数 i=left; j=right; while(i!=j) { while(i<j &&s[j]>=pivot) j--; //从右向左找第一个比基准数小的数 while(