GCD

原创 2015年11月18日 15:42:40

GCD编程

⺫⽬目录

⼀一、GCD的队列dispatch_queue_t

1、简介

2、创建1)create⽅方法

2)get系统⽅方法

3、修改create⽅方法创建的队列优先级⼆二、GCD的使⽤用⽅方法1、使⽤用步骤
2、代码⽰示例

三、GCD的其他⽅方法

1dispatch_after-------------------------指定时间后追加2dispatch_group_t-----------------------处理组3dispatch_barrier_async-----------------queue中等待A执⾏行后继续queue中追加到其他4dispatch_sync--------------------------同步5dispatch_apply-------------------------指定次数的重复追加6dispatch_suspend&dispatch_resume-------暂停和继续7dispatch_semaphore_t-------------------设置计数点8dispatch_once_t------------------------只执⾏行⼀一次

⼀一、GCD的队列dispatch_queue_t
1、简介
dispatch_queue_t queue:执⾏行处理的等待队列可以将需要处理的代码块添加到这个队列中

queue的分类:Serial顺序 Concurrent并⾏行2、创建

有两种⽅方法,分别是create⽣生成与get系统提供的

1)create queue:
dispatch_queue_create("", NULL)
//第⼀一个参数

queue的名字,第⼆二个参数为NULL表⽰示Serial顺序,这个只⽤用于防⽌止

多对⼀一的数据竞争时

dispatch_queue_create("",DISPATCH_QUEUE_CONCURRENT)//第⼀一个参数是queue的名字,第⼆二个参数为DISPATCH_QUEUE_CONCURRENT表⽰示Concurrent并⾏行

dispatch_release(queue);//createqueue需要在结束使⽤用后⼿手动进⾏行release

2)系统queue:分为Main主线程(也是⼀一个Serial)Global分线程(也是Concurrent)

            Main:dispatch_queue_t queue =
dispatch_get_main_queue();

Global://有四个优先级dispatch_queue_t queue =

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0)//第⼀一个参数为优先级,这⾥里为⾼高优先级,第⼆二个⽬目前未使⽤用,并且应该始终为0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF

AULT, 0)//第⼀一个参数为优先级,这⾥里为默认优先级,第⼆二个⽬目前未使⽤用,并且应该始终为0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW

, 0)//第⼀一个参数为优先级,这⾥里为低优先级,第⼆二个⽬目前未使⽤用,并且应该始终为0

                dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BAC

KGROUND, 0)//第⼀一个参数为优先级,这⾥里为后台优先级,第⼆二个⽬目前未使⽤用,并且应该始终为0

3、修改create⽅方法创建的队列优先级

create创建的queue默认为GlobalDEFAULT优先级,可以通过dispatch_set_target_queue(originQueue,targetQueue);//进⾏行修改,第⼀一个参数为希望修改的queue,第⼆二个参数为修改后的⽬目标queue,且第⼀一个queue必须为create创建的,不能使系统的Main或者Globalqueue。第⼆二个queue应该是通过Global创建的某种优先级的queue

⼆二、GCD的使⽤用⽅方法1、使⽤用步骤

first:使⽤用create或者系统⽅方法创建⼀一个queue

second:使⽤用dispatch_async(someQueue, ^{});执⾏行多线程的block⽅方法

third:在上⾯面多线程的block相应位置调⽤用dispatch_async(dispatch_get_main_queue(), ^{});回到主线程进⾏行操作

fourth:如果queue时通过create创建的,使⽤用dispatch_release(someQueue);进⾏行释放

2、代码⽰示例
dispatch_queue_t tempQueue =

dispatch_queue_create("com.llz.gcd.temp", NULL);
    dispatch_async(tempQueue,
                   ^{
                       //do something
dispatch_async(dispatch_get_main_queue(),

^{

//do

sometingdispatch_release(tempQueue);//因为是create出来的,所

以需要release三、GCD的其他⽅方法

1dispatch_afterdispatch_after://在⼀一个时间段后向某个queue中添加⼀一个

block⽅方法

dispatch_time_t time =dispatch_time(DISPATCH_TIME_NOW,(int64_t)3*NSEC_PER_SEC);//可以获得⼀一个距某个时间点相当时长的时间,第⼀一个参数为开始时间,现在设置的为当前时间,第⼆二个参数为时间流失的数值,现在是3s

    dispatch_after(time, dispatch_get_main_queue(),
                   ^{
                       NSLog(@"hello");

});

});

});//使⽤用dispatch_after⽅方法,在time后向主线程队列添加⼀一个block⽅方法

注意:dispatch_afterperformSelector:withObject:afterDelay:的区别,后者为相应时间后执⾏行该⽅方法;前者为相应时间后向队列添加⽅方法,⽽而这个⽅方法并不⼀一定⽴立刻执⾏行
2dispatch_group_t

dispatch_group_t:多线程组,将⼀一些queue,添加到这个中,可以实现监测这些queue全部完成的状态,如果为Serial就没有使⽤用这个的必要了

dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);//创建queue

dispatch_group_t group =dispatch_group_create();//创建group

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法,第⼀一个参数为组名,第⼆二个参数为queue名,第三个参数为block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_async(group, queue, ^{});//group中添加queue及其block⽅方法

dispatch_group_wait(group,DISPATCH_TIME_FOREVER);//可以通过wait⽅方法设置监测时间,现在设置的是永远,也能⽤用dispatch_time_t进⾏行特定时间的设定

dispatch_release(group);//因为是create出来的,所以需要release

3dispatch_barrier_asyncdispatch_barrier_async(someQueue, ^{}):⽤用于在某些⼀一

些动作中插⼊入⼀一些动作,⼀一般配合create出来的concurrent类型

queue使⽤用,Serial就没有使⽤用这个的必要了dispatch_queue_t queue =

dispatch_queue_create("", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{});dispatch_async(queue, ^{});dispatch_async(queue, ^{});dispatch_barrier_async(queue, ^{});//会将queue对应

block⽅方法加⼊入queue,并等此⽅方法结束后再继续queue⾥里的剩下block⽅方法

    dispatch_async(queue, ^{});
    dispatch_async(queue, ^{});

dispatch_release(queue);//因为是create出来的,所以需要release

4dispatch_sync

dispatch_sync(someQueue, ^{})dispatch_barrier_sync(someQueue, ^{})同步运⾏行,会死锁,但是不要⽤用在MainThread或者在⾮非concurrent的本⾝身queue⾥里⾯面进⾏行⾃自⼰己的sync
5dispatch_apply

dispatch_apply(10, someQueue, ^{}):⽤用于将某个block代码块按指定次数重复追加到queue中,并等待这些block全部执⾏行完毕,所以推荐⽤用在async

    NSArray *array = [NSArray
arrayWithObjects:@"",@"",@"",@"",@"",@"",@"", nil];
    dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF
AULT, 0);
    dispatch_async(queue,
                   ^{
                       dispatch_apply(array.count,

queue, ^(size_t index)//会将数组的长度作为次数,将block

码块添加到queue中,并等待其中所有block执⾏行完毕{

NSLog(@"%@",[array objectAtIndex:index]);

});

dispatch_suspend(someQueue)&dispatch_resume(someQueue):⽤用于将挂起时queue中尚未执⾏行的处理停⽌止以及继续开始7dispatch_semaphore_t

dispatch_semaphore_t:计数信号,为了更细分的保证不会造成程序的变量被同时访问

    dispatch_queue_t queue =
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEF
AULT, 0);

dispatch_semaphore_t semaphore =dispatch_semaphore_create(1);//初始化semaphore的计数,并设最⼤大为1

    NSMutableArray *array = [NSMutableArray
arrayWithCapacity:0];

for(int i = 0;i<10000;i++)//在循环中如果不⽤用semaphore,则async出来的线程们可能会同时访问array,造成异常

    {
        dispatch_async(queue,

^{

dispatch_semaphore_wait(semaphore,DISPATCH_TIME_FOREVER);//第⼀一个参数为技术信号,第⼆二个参数为等待时间,现在是⼀一直等待直到semaphore的值等于1

[array addObject:[NSNumbernumberWithInt:i]];//排他成功后,即semaphore等于1时,执⾏行数

组添加对象操作,同时将semaphore值变为0dispatch_semaphore_signal(semaphore);//semaphore的值

6dispatch_suspend&dispatch_resume

增为1}

});

});

dispatch_release(semaphore);//因为是create出来的,所以需要release

8dispatch_once_tdispatch_once_t:保证其block块在应⽤用中只执⾏行⼀一次

    +(MyClass *)sharedInstance
    {
        static MyClass *sharedManager;

static dispatch_once_t onceToken;//通过这个onceToken使得下⾯面的实例化只做⼀一次

        dispatch_once(&onceToken, ^{
            sharedManager = [[MyClass alloc] init];
        });
        return sharedManager;
    }

gcd(a,b)=1的含义及用法

历史上第一个称得上算法的好像就是这个欧几里得算法,其实就是地球人都知道的辗转相除,不要小看她,她是很美的。   简单的描述就是,记gcd(a,b)表示非负整数a,b的最大公因数,那么:gcd(a,...
  • sunstars2009918
  • sunstars2009918
  • 2012年01月10日 10:30
  • 3278

GCD算法

网上代码多的是,我只是记下来而已 基础 int gcd(int a,int b) { int r; while(b>0) { r=a%b; ...
  • Niteip
  • Niteip
  • 2014年02月19日 10:17
  • 6701

算法导论 31-1 二进制的gcd算法

33-1(二进制的gcd算法) 与计算余数的执行速度相比,大多数计算机执行减法运算,测试一个二进制整数的奇偶性运算以及折半运算的执行速度都要更快些。本题所讨论的二进制gcd算法中避免了欧几里得算法中对...
  • bitspx
  • bitspx
  • 2014年11月23日 09:58
  • 1243

GCD的简单应用--异步加载图片

在这里,简单介绍下GCD的应用。 1.编程场景 :     在iPhone上做一个下载图片的功能,很简单,就是在屏幕上放置一个按钮,点击该按钮,显示一个转动的圆圈,表示正在下载,下载完成后,将图片...
  • qq_34417314
  • qq_34417314
  • 2016年09月06日 14:05
  • 728

GCD的四种队列,两种函数和六种组合

//    四种队列     //————————————————————————————————————————————————————————————————————————————————...
  • GuodongSun0
  • GuodongSun0
  • 2015年06月05日 19:02
  • 1312

ios多线程学习之GCD线程锁

因为在以前的开发中实在是很少会用到多线程的知识,但是现在手中的项目是做视频开发。 而在视频开发类项目中,最困难的就是逻辑和多线程处理,这几天没事研究了一下线程锁,我觉的一个简答的代码实例,就能体现出 ...
  • my_programe_life
  • my_programe_life
  • 2015年11月30日 00:03
  • 1383

iOS与OS多线程和内存管理----GCD底层实现

GCD实现 GCD实在内核XNU上实现的,实现Dispatch Queue的软件组建: libdispatch组件,主要提供Dispatch Queue技术; Libc(pthreads)组件,...
  • u011774517
  • u011774517
  • 2017年03月02日 15:09
  • 788

最大公约数GCD的三种算法程序

这里给出使用欧几里得算法求最大公约数的递归和非递归的程序,同时给出穷举法求最大公约数的程序。 从计算时间上看,递推法计算速度最快。 程序中包含条件编译语句用于统计分析计算复杂度。 /* * 计算两个...
  • tigerisland45
  • tigerisland45
  • 2016年04月14日 14:57
  • 7871

扩展GCD算法学习笔记

首先对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整数对 x,y ,使得 gcd(a,b)=ax+by。求解 x,y的方法...
  • xieguofu2014
  • xieguofu2014
  • 2015年10月28日 20:37
  • 1006

求最大公约数gcd算法

求两个正整数a,b最大公约数方法较常用的是欧几里得提出的辗转相除法 假设a=b*k+r …….(1),则gcd(a,b)=gcd(b,r)…….(2); 证明: 设c=gcd(a,b),则a=c...
  • GaoShan1011
  • GaoShan1011
  • 2016年09月21日 16:57
  • 388
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:GCD
举报原因:
原因补充:

(最多只允许输入30个字)