iOS:多线程技术GCD的使用
GCD的使用:
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函数块
#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的使用的更多相关文章
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- iOS多线程技术
iOS多线程技术主要分配NSThread.NSOperation和GCD.下边来简单的介绍一下吧. 随性一点,就不按照顺序来了.所以先介绍一下NSOperation. ---------------- ...
- iOS 多线程技术2
iOS 多线程技术2 NSOperation NSInvocationOperation //创建一个队列 NSOperationQueue *queue = [[NSOperationQueue a ...
- iOS开发之多线程技术——GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- iOS开发之多线程技术—GCD篇
本篇将从四个方面对iOS开发中GCD的使用进行详尽的讲解: 一.什么是GCD 二.我们为什么要用GCD技术 三.在实际开发中如何使用GCD更好的实现我们的需求 一.Synchronous & ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
随机推荐
- elasticsearch使用Analyze API
curl -XGET 'localhost:9200/index_name/_analyze?pretty&field=type_name.field_name' -d 'Robots car ...
- 深入理解计算机(CSAPP)资源汇总
用于资源记录. 视频: 卡内基梅隆大学 Introduction to Computer Systems CMU 15-213 Fall 作业(labs): Lab Assignments
- SEO编辑必看:撰写搜索引擎喜爱的标题
导读:非常有干货,百度站长平台刚发布了这篇篇文章,文章建议:1,标题字数控制在65个字节内,2,重要内容放在标题的最前面,3,添加与网页内容最相关的.用户更常用的.满足用户明确需求的.体现时效性.关键 ...
- RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?
https://www.zhihu.com/question/25912483?sort=created
- AC日记——[Hnoi2017]影魔 bzoj 4826
4826 思路: 主席树矩阵加减+单调栈预处理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 200005 ...
- ImportError: No module named etree.ElementTree
ImportError: No module named etree.ElementTree 排查N久,才发现是因为文件名是xml.py的缘故,文件名一定不要用关键词.....
- 基于kbengine 0.4.20
前言: v0.0.1 2015-04-10 誉小痕(shawhen2012@hotmail.com) v0.0.2 2015-04-12 誉小痕(shawhen2012@hotmail.com) ch ...
- Python 实现腾讯新闻抓取
原文地址:http://www.cnblogs.com/rails3/archive/2012/08/14/2636780.htm 思路: 1.抓取腾讯新闻列表页面: http://news.qq.c ...
- npm 安装或更新模块失败的解决办法
头一次关注npm,在刚刚安装的机子上使用更新指令却报错,我还以为是SHA512有什么问题,后来发现是因为一些网络原因,所以,如果出现错误,务必修改默认配置为国内镜像,但是在publish之前,记得要改 ...
- HDU 6119 2017百度之星初赛B 小小粉丝度度熊 (二分)
小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...