gcd

转载 2015年07月10日 18:23:43
GCD 是c语言的框架,不需要手动管理内存
 
是一个面向任务   不是面向线程,不需要管理线程的生命周期
 
GCD 任务/队列 执行函数
任务:Block  任务都封闭在Block中。  —— 线程执行
 
队列:存放任务    FIFO (先进先出的原则)
        GCD中的队列:
                                  串行队列:想要任务按顺序执行
//    创建一个串行队列
    dispatch_queue_t serialQueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
                                  并发队列:想要任务并发执行(同时执行)
//    创建一个并发队列
    dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
两个特殊队列
          主队列:主队列中存放的任务最终会交给主线程来执行。
//    获取主队列  不需要创建
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
          全局并发队列:也是并发队列 没有任何区别。 平常开发用非常多。 (不需要管理 程序需要开多少条线程。 会按照当前的设备来自动开线程          
//    获取全局并发队列  不需要创建
//    long identifier  ios8之前 传线程优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT   ios8以后传0 可以兼容之前的版本
//    <#unsigned long flags#> 保留接口 还未用  传 0
    dispatch_queue_t globalQueue = dispatch_get_global_queue(0, 0);
 
执行函数: 将队列中的任务放到线程中执行
                    同步执行函数:不具备开启新线程的能力。任务中会在当前线程执行。
//      同步
    dispatch_sync(concurrentQueue, ^{
        NSLog(@"下载图片2");
    });
同步函数 + 并发队列 和 + 串行队列 效果是一样的
 
                    异步执行函数:具备开启新线程能力。 是否开启线程不一定。 与队列有关
//    执行函数
//      异步执行
//      dispatch_queue_t queue 队列
//      ^(void)block    任务
    dispatch_async(serialQueue, ^{
        NSLog(@"下载图片");
    });
 
GCD的作用:
     1>将任务添加到队列中
     2>用执行函数执行任务中的任务 
2个执行函数 * 3个队列 
 

同步函数例子

复制代码
 1 // 同步函数 + 串行队列
 2 // 不会开启新线程,任务是在当前线程执行.
 3 // 如果当前线程是子线程的话,就是在子线程执行
 4 // 任务是按顺序执行的
 5 -(void)test1
 6 {
 7     dispatch_queue_t serialQueue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);
 8     // 同步函数
 9     dispatch_sync(serialQueue, ^{
10         // 任务
11         NSLog(@"下载图片1%@",[NSThread currentThread]);
12     });
13     // 同步函数
14     dispatch_sync(serialQueue, ^{
15         // 任务
16         NSLog(@"下载图片2%@",[NSThread currentThread]);
17     });
18     // 同步函数
19     dispatch_sync(serialQueue, ^{
20         // 任务
21         NSLog(@"下载图片3%@",[NSThread currentThread]);
22     });
23 }
24  
25 // 同步函数 + 全局并发队列
26 // 不会开启新线程,在当前线程执行
27 // 如果当前线程是子线程的话,就是在子线程执行
28 // 任务按顺序执行
29 - (void)test2
30 {
31     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
32     dispatch_sync(queue, ^{
33         NSLog(@"下载图片1%@",[NSThread currentThread]);
34     });
35     dispatch_sync(queue, ^{
36         NSLog(@"下载图片2%@",[NSThread currentThread]);
37     });
38     dispatch_sync(queue, ^{
39         NSLog(@"下载图片3%@",[NSThread currentThread]);
40     });
41 }
42 // 对于同步函数 + 串行队列 和 +并发队列 执行效果是一样的.
43 // 同步函数 +主队列
44 // 主队列中的任务都会交给主线程来执行.
45 // 主线程中的任务和主队列中的任务相互等待,无法执行完毕
46 - (void)test3
47 {
48     dispatch_sync(dispatch_get_main_queue(), ^{
49         NSLog(@"下载图片1%@",[NSThread currentThread]);
50     });
51     dispatch_sync(dispatch_get_main_queue(), ^{
52         NSLog(@"下载图片2%@",[NSThread currentThread]);
53     });
54     dispatch_sync(dispatch_get_main_queue(), ^{
55         NSLog(@"下载图片3%@",[NSThread currentThread]);
56     });
57     NSLog(@"test3End%@",[NSThread currentThread]);
58 
59 }
复制代码

 

异步函数例子  

 
复制代码
 1 // 异步函数 + 主队列
 2     // 不会开启新线程
 3     // 任务按顺序执行
 4     // 不会卡死主线程
 5     dispatch_async(dispatch_get_main_queue(), ^{
 6 
 7         NSLog(@"下载图片1%@", [NSThread currentThread]);
 8     });
 9     // 异步函数 + 主队列
10     dispatch_async(dispatch_get_main_queue(), ^{
11         NSLog(@"下载图片2%@", [NSThread currentThread]);
12     });
13     // 异步函数 + 主队列
14     dispatch_async(dispatch_get_main_queue(), ^{
15         NSLog(@"下载图片3%@", [NSThread currentThread]);
16     });
17  
18 // 异步函数 + 串行队列
19 // 开启一条新线程.
20 // 一个队列对应一条线程.每一条线程中的任务都是按顺序执行-- 串行执行.
21 // 如果创建了多个串行队列,会开启多条线程.
22 - (void)test1
23 {
24     dispatch_queue_t queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);
25     dispatch_queue_t queue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL);
26     dispatch_async(queue, ^{
27         NSLog(@"下载图片1%@", [NSThread currentThread]);
28     });
29     dispatch_async(queue1, ^{
30         NSLog(@"下载图片2%@", [NSThread currentThread]);
31     });
32 
33     dispatch_async(queue1, ^{
34         NSLog(@"下载图片3%@", [NSThread currentThread]);
35     });
36 
37     dispatch_async(queue, ^{
38         NSLog(@"下载图片4%@", [NSThread currentThread]);
39     });
40 } 
41  
42 // 异步函数 + 全局并发队列
43 // 开启一条线程,在子线程中执行任务
44 // 根据任务数量,开启多条线程.
45 // GCD自动帮我们开启一定数量的线程.
46 - (void)test2
47 {
48     dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
49     // 异步函数 + 全局并发队列
50     dispatch_async(queue, ^{
51         NSLog(@"下载图片1%@",[NSThread currentThread]);
52     });
53     // 异步函数 + 全局并发队列
54     dispatch_async(queue, ^{
55         NSLog(@"下载图片2%@",[NSThread currentThread]);
56     });
57 }
58  
59     // 一次性代码,只会执行一次,能够保证线程安全的.
60     // 线程第一次执行完任务之后,其他线程就不会再进来了.
61     static dispatch_once_t onceToken;
62     dispatch_once(&onceToken, ^{
63         NSLog(@"%@",[NSThread currentThread]);
64         NSLog(@"一次性代码,只执行一次%@",string);
65     });
66  
67    //队列组的使用
68 -(void)groupTest
69 {
70     __block UIImage *image1,*image2;
71     // 创建一个队列组
72     dispatch_group_t group = dispatch_group_create();
73     // 将我们需要执行的任务放在队列中里面
74     // 异步的方法
75     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
76         // 任务1
77         NSLog(@"renwu 1");
78         image1 = [self downloadImageWithUrlString:@"http://e.hiphotos.baidu.com/zhidao/pic/item/203fb80e7bec54e722c5454ebb389b504fc26ab0.jpg"];
79     });
80     // 再往队列组中添加一个任务
81     dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
82         // 任务2
83         NSLog(@"renwu 2");
84         image2 = [self downloadImageWithUrlString:@"http://www.cnwan.com.cn/uploads/allimg/2011-07/01002414-1-10j14.jpg"];   
85     });
86    // 队列组中的任务都执行完毕以后,会发送一个通知,执行下面的方法
87     dispatch_group_notify(group, dispatch_get_main_queue(), ^{
88         // 队列组中的任务执行完毕之后的操作
89         NSLog(@"renwu over");
90        // 合并图片
91         self.imageView.image = [self BingImageWith:image1 :image2]; 
92     });
93 }

NSTimer、CADisplayLink、GCD 三种定时器的用法

在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法。在这个时候,我们就需要用到定时器。 在iOS中有很多方法完成定时器的任务,例如 NSTimer、CAD...
  • shan1991fei
  • shan1991fei
  • 2016年03月25日 09:33
  • 711

多线程、特别是NSOperation 和 GCD 的内部原理

多线程、特别是NSOperation 和 GCD 的内部原理 简介 多线程是一个比较轻量级的方法来实现单个应用程序内多个代码执行路径。 在系统级别内,程序并排执行,程序分配到每个程序的执行时间是...
  • Charles91
  • Charles91
  • 2016年01月19日 15:44
  • 5791

iOS- NSThread/NSOperation/GCD 三种多线程技术的对比及实现

转自出处:http://www.cnblogs.com/qingche/p/3496190.html
  • martin_liang
  • martin_liang
  • 2014年11月02日 18:19
  • 7373

GCD高级用法-信号量

GCD中的信号量是指 Dispatch Semaphore。 所谓信号,类似于道路上的信号灯,一种用来标识等待还是通过的标志。绿灯通过,红灯等待。道路中通过信号灯的颜色标识通过和等待,而Dispat...
  • u014205965
  • u014205965
  • 2015年05月22日 11:25
  • 2302

GCD常用函数说明

提交队列函数(即执行): dispatch_async(dispatch_queue_t queue, ^(void)block):异步执行队列 dispatch_sync(dispatch_que...
  • hcy_12345
  • hcy_12345
  • 2015年07月25日 18:26
  • 955

IOS GCD的介绍及使用举例&GCD优先级改变、after、group、barrier、sync、apply、semaphore、once等操作方法

GCD编程 目录 一、
  • u011711753
  • u011711753
  • 2014年04月18日 16:50
  • 2855

扩展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
  • 941

GCD算法(最大公约数算法)解析

GCD(Great Common Divisor)算法,即所谓最大公约数算法,也称为HCF(Highest Common Factor)算法。而所谓的最大公约数,指的是几个整数中共有约数中最大的一个。...
  • Linoi
  • Linoi
  • 2014年02月13日 18:00
  • 2513

HDU5381【莫队算法+区间GCD特性】

NO RESPONSE!
  • KEYboarderQQ
  • KEYboarderQQ
  • 2017年02月18日 22:36
  • 395

最大公约数和快速gcd

最大公约数有两种基本的求法:(1)辗转相除法(2)更相减损法,首先来证明一下:(1)证明gcd(a,b)=gcd(b,a(1)证明gcd(a,b) = gcd(b,a%b)假设a=k1m,b=k2m,...
  • pp634077956
  • pp634077956
  • 2016年11月01日 15:40
  • 2119
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:gcd
举报原因:
原因补充:

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