GCD的使用:

1.队列的类型
     1.1 主队列:mian queue,主线程队列,负责更行UI的操作。是一个串行的队列。
     1.2 系统默认的并行队列:global queue,按优先级分类。
     1.3 自定义的队列:可以创建串行队列或者是并行的队列
 
2.任务
     2.1 封装的形式:block方法或C语言的函数
     2.2 添加到队列的方式:同步或异步(只对并行队列有区别)
         例如服务器请求:
         同步:提交请求->等待服务器处理(这个期间客户端浏览器不能干任何事)->处理完毕返回   
         异步:请求通过事件触发->服务器处理(这个期间客户端浏览器仍可以干其他的事)->处理完毕返回
 
3.特殊使用
     3.1 只执行一次 dispatch_once(dispatch_once_t *predicate, dispatch_block_t block);(多用于单例模式)
     3.2 延时执行    dispatch_after(dispatch_time_t when,dispatch_queue_t  queue,dispatch_block_t block);
     3.3 成组的执行任务       dispatch_group_create(void);
     3.4 创建自定义的队列    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
     3.5 创建默认的全局队列 dispatch_get_global_queue(long identifier, unsigned long flags)
     3.6 获取主队列             dispatch_get_main_queue(void)
     3.7 异步执行                dispatch_async(dispatch_queue_t queue, dispatch_block_t block);
     3.8 同步执行              dispatch_sync(dispatch_queue_t queue, dispatch_block_t block);
     3.9 多次执行   dispatch_apply(size_t iterations, dispatch_queue_t queue,void (^block)(size_t));
     …………………等等…………………
 

4.几个方法参数解释:

<1>创建自定义的队列    dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);

const char *label:队列名字                   dispatch_queue_attr_t attr:队列执行方式(串行、并行)

<2>创建默认的全局队列 dispatch_get_global_queue(long identifier, unsigned long flags)

long identifier:队列执行的优先级           unsigned long flags:默认为0即可

<3>多次执行         dispatch_apply(size_t iterations, dispatch_queue_t queue,void (^block)(size_t));

size_t iterations:执行次数      dispatch_queue_t queue:队列      void (^block)(size_t):block函数块

 
5.队列方式宏定义(用于创建自定义队列时的参数)

#define DISPATCH_QUEUE_SERIAL NULL         //串行

#define DISPATCH_QUEUE_CONCURRENT        //并行

6.队列优先级宏定义(创建全局队列时的参数)

#define DISPATCH_QUEUE_PRIORITY_HIGH 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)

#define DISPATCH_QUEUE_PRIORITY_BACKGROUND INT16_MIN

7.更能区分

主队列:专门用来执行主线程的,进行UI的更新操作

全局队列或自定义队列:用来添加并执行其他的线程,进行数据的操作

具体举例如下:

例子1:采用不分组的方式,将多线程添加到队列中,然后进行多线程的操作。

1.准备UI界面布局:拖入一个文本视图控件,并关联相关的类中,同时在类中声明一个票数变量

@interface ViewController ()
{
NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

2.设置票数,同时将原来文本视图中默认的数据清空,取消自动布局便于后面添加数据时自动滚动文本视图

 //设置数据和文本视图
_tickets = ;
[self.textView setText:@""];
self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.创建全局队列,并设置优先级,设置并行方式

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );

4.用GCD创建任务线程,并将线程添加到队列中,采用异步执行方式

dispatch_async(queue, ^{
[self GCDSellTicketMethod:@"GCD售票线程-1"];
}); dispatch_async(queue, ^{
[self GCDSellTicketMethod:@"GCD售票线程-2"];
});

5.定义更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text
{
//1.获取原来的数据
NSMutableString *content = [NSMutableString stringWithString:self.textView.text];
NSRange range = NSMakeRange(content.length, ); //2.追加新的内容
[content appendString:[NSString stringWithFormat:@"\n%@",text]];
[self.textView setText:content]; //3.滚动视图
[self.textView scrollRangeToVisible:range];
}

6.定义任务线程的执行方法

#pragma mark -执行线程的操作

-(void)GCDSellTicketMethod:(NSString *)name
{
while (YES)
{
if(_tickets > )
{
//使用GCD
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
NSString *info = [NSString stringWithFormat:@"总票数:%ld,当前的线程:%@",_tickets,name];
[self appendTextView:info]; //卖票
_tickets--;
}); //线程休眠
if([name isEqualToString:@"GCD售票线程-1"])
{
[NSThread sleepForTimeInterval:0.3f];
}
else
{
[NSThread sleepForTimeInterval:0.2f];
}
}
else
{
//使用GCD更新UI
dispatch_async(dispatch_get_main_queue(), ^{
NSString *info = [NSString stringWithFormat:@"票已经卖完,当前线程:%@",name];
[self appendTextView:info];
}); //退出线程
break;
}
}
}

例子2:采用分组的方式,将线程组添加到队列中,然后进行多线程的操作。

1.准备UI界面布局:拖入一个文本视图控件,并关联相关的类中,同时在类中声明一个票数变量

@interface ViewController ()
{
NSInteger _tickets;
}
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

2.设置票数,同时将原来文本视图中默认的数据清空,取消自动布局便于后面添加数据时自动滚动文本视图

 //设置数据和文本视图
_tickets = 20;
[self.textView setText:@""];
self.textView.layoutManager.allowsNonContiguousLayout = NO;

3.创建一个线程分组

dispatch_group_t group = dispatch_group_create();

4.创建自定义的队列,并设置队列执行方式为并行方式

dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT);

5.用GCD创建任务线程组,并将线程组添加到队列中,采用分组异步执行方式

dispatch_group_async(group,queue, ^{

[self GCDSellTicketMethod:@"GCD售票线程-1"];

});

dispatch_group_async(group,queue, ^{

[self GCDSellTicketMethod:@"GCD售票线程-2"];

});

6.等线程组中的所有任务完成后,会接收到通知,更新UI

dispatch_group_notify(group, queue, ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSString *info = [NSString stringWithFormat:@"票已经卖完"];
[self appendTextView:info];
});
});

7.定义更新UI的方法

#pragma mark -更新UI的操作

-(void)appendTextView:(NSString *)text
{
//1.获取原来的数据
NSMutableString *content = [NSMutableString stringWithString:self.textView.text];
NSRange range = NSMakeRange(content.length, 2); //2.追加新的内容
[content appendString:[NSString stringWithFormat:@"\n%@",text]];
[self.textView setText:content]; //3.滚动视图
[self.textView scrollRangeToVisible:range];
}

8.定义任务线程的执行方法

#pragma mark -执行线程的操作

-(void)GCDSellTicketMethod:(NSString *)name
{
while (YES)
{
if(_tickets > 0)
{
//使用GCD
dispatch_async(dispatch_get_main_queue(), ^{
//更新UI
NSString *info = [NSString stringWithFormat:@"总票数:%ld,当前的线程:%@",_tickets,name];
[self appendTextView:info]; //卖票
_tickets--;
}); //线程休眠
if([name isEqualToString:@"GCD售票线程-1"])
{
[NSThread sleepForTimeInterval:0.3f];
}
else
{
[NSThread sleepForTimeInterval:0.2f];
}
}
else
{
//退出线程
break;
}
}
}

两种情况的演示结果如下:

iOS:多线程技术GCD的使用的更多相关文章

  1. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  2. iOS多线程技术

    iOS多线程技术主要分配NSThread.NSOperation和GCD.下边来简单的介绍一下吧. 随性一点,就不按照顺序来了.所以先介绍一下NSOperation. ---------------- ...

  3. iOS 多线程技术2

    iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue a ...

  4. iOS开发之多线程技术——GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  5. iOS开发之多线程技术—GCD篇

    本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...

  6. [iOS]多线程和GCD

    新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...

  7. iOS多线程 NSThread/GCD/NSOperationQueue

    无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...

  8. IOS多线程(GCD)

    简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...

  9. iOS 多线程 之 GCD(大中枢派发)(一)

    导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...

随机推荐

  1. 关于大O法的几点解释

    大O表示法指出算法有多快.例如,假设列表包含n个元素.简单查找需要检查每个元素,因此需要执行n次操作.使用大O表示法,这个运行时间为O(n).主要单位不是秒啊,大O表示法值得并非以秒为单位的速度,而是 ...

  2. 机器学习方法(六):随机森林Random Forest,bagging

    欢迎转载,转载请注明:本文出自Bin的专栏blog.csdn.net/xbinworld. 技术交流QQ群:433250724,欢迎对算法.技术感兴趣的同学加入. 前面机器学习方法(四)决策树讲了经典 ...

  3. JavaScript性能优化【转载】

    你愿意为打开一个网页等待多长时间?我一秒也不愿意等.但是事实上大多数网站在响应速度方面都让人失望.现在越来越多的人开始建立自己的网站,博客,你的网页响应速度如何呢?在这篇文章中我们来介绍一下提高网页性 ...

  4. Hydra 8.4/8.5新增功能

    Hydra 8.4/8.5新增功能   Kali Linux 2017.1自带的Hydra为8.3,现在Hydra升级到8.5,新增以下功能.   (1)为输出文件选项-o,添加一个配套选项-b,允许 ...

  5. nyoj 300 (矩阵快速幂)Kiki & Little Kiki 2

    描述 There are n lights in a circle numbered from 1 to n. The left of light 1 is light n, and the left ...

  6. 数据库SQL归纳(三)

    数据查询功能 单表查询 选择若干列 1. 指定列 SELECT 列名称 FROM 表名称 2. 全部列 SELECT * FROM 表名称 3. 经过计算的列 SELECT Sname, 2019-S ...

  7. [Codeforces 1053B] Vasya and Good Sequences

    Link: Codeforces 1053B 传送门 Solution: 其实就是暴力 观察需要满足的条件: 1.个数和为偶数 2.最大个数不大于其它所有个数的和 如果只有第一个条件记录前缀和的奇偶性 ...

  8. [百度之星2014资格赛] Disk Schedule 报告

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  9. [转]Java五个最常用的集合类之间的区别和联系

    Map<String, ?>只能是只读模式,不能增加,因为增加的时候不知道该写入什么类型的值:Map<String, Object>可以读和写,只要是所有Object类的子类都 ...

  10. Educational Codeforces Round 9 F. Magic Matrix 最小生成树

    F. Magic Matrix 题目连接: http://www.codeforces.com/contest/632/problem/F Description You're given a mat ...