IOS中级篇 —— 多线程 - GCD

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 }
时间: 2024-08-20 04:26:12

IOS中级篇 —— 多线程 - GCD的相关文章

IOS中级篇—— 多线程--NSOperation

NSOperation 操作? 任务是对代码的封装, 操作是对任务的封装 --目的:就是可以随时的暂停/恢复/取消任务; NSOperation 对GCD的封装. OC 运用起来更加方便. 抽象类. 车 NSOperation的使用: <1> 操作直接调用 start方法,就是在当前线程执行(Block中封装的任务数大于1的情况除外). <2> 就是将操作放在队列中.自动的帮我们开启线程,来执行操作. 两个子类: NSInvocationOperation: 调用 ? ? ? 1.

iOS开发之多线程——GCD介绍

iOS开发之多线程——GCD的介绍 一.简单介绍 1.GCD ( Grand Central Dispatch) 可以翻译为“中枢调度器”.纯C语言,并且提供了非常强大的函数. 2.GCD 有什么优势: GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多地CPU 内核 (比如双核.四核) GCD会自动管理线程的生命周期 (创建线程.调度任务.销毁线程) 程序猿只需要告诉GCD想要执行设呢任务,不需要编写任何线程管理代码. 二.任务和队列 GCD中有两个核心概念 (1)任务: 执

IOS开发之多线程 -- GCD的方方面面

前言:这篇GCD的博文是本人阅读了很多海内外大神的关于GCD的文章,以及结合之前自己对GCD的粗浅的认识,然后取其精华,去其槽粕,综合起来的笔记,而且是尽可能的以通熟易懂的并且是正确的理论论述方式呈现给读者,同时也是讲大神博客中有的深涩的理论理解的通熟易懂转述给读者,已经是尽可能的让读者深入理解和掌握多线程的知识以及GCD的使用技术.最后的附录中,我将会给出所有本人阅读的大神写的关于多线程或者是GCD的文章链接,大家感兴趣的,可以去参考和学习.也许,看我的这篇就够了,因为我就是参考他们的,嘻嘻.

iOS核心笔记——多线程-GCD

1.GCD简介: ?了解:GCD全称为"Grand Central Dispatch",纯C语言,GCD提供了非常多功能强大的函数:GCD中所有的函数都包含于Libdispatch库中. 1-1.使用GCD的优势: ?了解:1.GCD是苹果公司为多核的并行运算提出的解决方案: ?了解:2.GCD会自动利用更多的CPU内核(例如:双核.四核): ?了解:3.GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程). 1-2.GCD两大核心概念: 名称 作用: 任务 执行什么操作 队

iOS开发之多线程 GCD

基础知识: 下午9:09 一.基础概念 1.什么是GCD 全称是Grand Central Dispath 纯C语言编写,提供非常多且强大的函数,是目前推荐的多线程开发方法,NSOperation便是基于GCD的封装 2.GCD的优势 1.为多核的并行运算提出了解决方案 2.GCD会自动利用更多的CPU内核,比如 双核,四核 3.GCD自动管理线程的生命周期(创建线程,调度任务,销毁线程) 4.程序员只需告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.GCD中的两个核心概念 1.任务

IOS——中级篇 --TableView以及Cell

????? //? 设置tableView的行高 ??? self.tableView.rowHeight = 100;//? 设置tableView分割线的样式//? UITableViewCellSeparatorStyleNone 不显示分割线//? UITableViewCellSeparatorStyleSingleLine? 显示分割线(默认) ??? self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingl

IOS中级篇 —— 日期时间对象

结合NSCalendar和NSDate能做更多的日期\时间处理 获得NSCalendar对象 NSCalendar *calendar = [NSCalendar currentCalendar];?获得年月日 - (NSDateComponents *)components:(NSCalendarUnit)unitFlags fromDate:(NSDate *)date; //创建日期 NSDate?*d = [NSDate?date]; //创建日期对象 NSCalendar?*ca =

IOS中级篇——何时使用copy,strong,weak,assign关键字 定义属性

? 父类指针可以指向子类对象 ? //定义block别名. typedef void (^LYItemOption)(); @interface LYItemArrow : LYItem@property(nonatomic,strong) Class desController; @property(nonatomic,copy) LYItemOption option; ? ? 1.strong :除NSString\block以外的OC对象 ? @property(nonatomic,st

IOS中级篇 —— Autoresizing

? UIView *blueView = [[UIView alloc] init]; ??? [self.view addSubview:blueView]; ??? blueView.backgroundColor = [UIColor blueColor]; ??? ??? blueView.center = self.view.center; ??? blueView.bounds = CGRectMake(0, 0, 150, 150); ??? self.blueView = blu