导读:《演讲与口才》形考任务一,一、单项选择(只有一个***是正确的,共20分))1、演讲离不开有声语言和(),是演讲术的逐步完善与形成时期,(2分)A、《论演讲家》B、《论语》C、《演讲学》D、《修辞学》,3、鲁迅1927年在广州作了题为()的演讲,是学术演讲的典范,4、演讲的主题只能是()个,5、经济演讲具有的特点,6、演讲活动的实质是信息的传递和()的过程,7、演讲者的语言总是(),8、演讲是一 《演讲与口才》形考任务一 一、单项选择(只有一个***是正确的,多选、错选均不得分(每题2分,共20分)) 1、演讲离不开有声语言和( )。(2分) A、 手势动作
B、 体态语言
C、 眼神交流
D、 头部动作
2、公元前5世纪中叶到亚里士多德写出( ),是演讲术的逐步完善与形成时期。(2分)
A、 《论演讲家》
B、 《论语》
C、 《演讲学》
D、 《修辞学》
3、鲁迅1927年在广州作了题为()的演讲,是学术演讲的典范。(2分)
A、 《魏晋玄学》
B、 《魏晋风度及文章与药及酒之关系》
C、 《魏晋风度》
D、 《中国小说史略》
4、演讲的主题只能是( )个。(2分)
5、经济演讲具有的特点,下列哪个说法是错误的。( )(2分)
A、 语言明确,以解说为主
B、 高度的求实性
C、 刚烈的鼓动性
D、 重视信息,讲究策略
6、演讲活动的实质是信息的传递和( )的过程。 (2分)
7、演讲者的语言总是( )。(2分)
A、 交流式
B、 对白式
C、 独白式
D、 旁白式
8、演讲是一种具有( )和艺术性的社会实践活动。(2分)
A、 大众性
B、 理想性
C、 现实性
D、 社会性
9、下列哪项选项是错误的。( )(2分)
A、 旬子说:“辞达而已。”
B、 孔子说:“言之无文,行而不远。”
C、 孟子说:“不以文害辞,不以辞害志。”
D、 墨子说:“论求群言之比。”要求讲究各种表达方法的比较。
10、下列哪项选项是错误的。( )(2分)
A、 演讲不能传播知识。
B、 演讲是政治斗争的有力武器。
C、 演讲是经济活动的理想筹码。
D、 演讲是鼓舞士气的战斗号角。 二、简答题 1、简述收集材料的原则。(10分) 答:1定向。2充分。3真实。4新鲜。5典型。6具体。7感人 2、如何选择演讲题目?(10分) 答:1体验时代精神,顺应历史潮流。2适合听众要求,内容有的放矢。3切合自己的身份,不妨:驾轻就熟“。4注意演讲场合,考虑预定时间。 3、简述演讲的社会功能。(10分) 答:1政治斗争的有力武器。2经济活动的思想筹码。3鼓舞士气的战争号角。4传播知识的有效途径。5思想教育的最佳形式。6人才考核的重要尺度。 4、简述演讲的特点。(10分) 答:1演讲是一种具有现实性和艺术性的社会实践活动。
2演讲必须在特定的时空环境中进行。
3演讲离不开有声语言与体态语言。
三、名词解释 1、道德演讲:(5分) 是以思想品德教育为目的一种演讲。 2、演讲:(5分) 是指在特定的时空环境中,以有声语言和相应的体态语言为手段,公开向听众传递信息,表述见解,阐明事理,抒发感情。以期达到感召听众的目的。它是一种直接的带有艺术性的社会实践活动。 四、写作题 1、“五四”青年节,学校组织一场以歌颂五四精神为主题的演讲活动。请你就此写一篇演讲稿。字数在800~1000字之间。分数要点:(1)主题明确(5分)(2)结构完整(5分)(3)材料充实(5分)(4)有理有据(5分)(5)语句流畅(5分)(6)题旨深刻,富有文采(5分)(30分) 亲爱的老师、同学们:
大家早上好!我讲话的题目是“宏扬五四精神、构建和谐校园”。五四运动已经过了八十六年,八十六年前爆发的五四运动是一场彻底反帝反封建的伟大爱国革命运动,一场伟大的思想解放运动和新文化运动,五四运动促进了马克思主义在中国的传播,为中国***的成立准备了条件,从而拉开了中国新民主主义革命的序幕。五四运动也是现代中国青年运动的发端,正是在五四运动中,中国青年作为一支新生的力量登上了历史舞台,五四运动给我们留下了一笔宝贵的精神财富。这就是爱国、进步、民主、科学的五四精神。五四精神始终激励着一代又一代中国青年不断前进、不断发展、不断创新。
时代在发展,社会在进步,五四精神也在不断的丰富和发展。具体到我们学校,我们自身就是努力实践“求知、求真、求实”的校训,以“与人为善,善待人生”为处事做人的原则。努力构建和谐。孙校长早就高瞻远瞩的提出了校训、校魂,为我们构建和谐校园指明方向,提供了准则。求知、求真、求实,要 2
求我们牢记求真务实以学为本的天职。用校训指导我们的学习和工作,踏踏实实一丝不苟,始终保持积极进取的精神状态,克服自满情绪,努力培养自己的创造能力,发挥创造潜能,把实事办好,把好事办实。用自己的文明行动,优异成绩来报答父母、回报学校。与人为善,善待人生要求我们始终怀着一颗善之心、平之心、坦之心、诚之心、真之心去面对每个人每件事,从小事做起、从我做起。与人为善,善待人生是一个不断积累、不断创造、不断付出艰辛劳动的过程,不积跬步,无以至千里,不积细流无以成江海。只要我们默默耕耘,默默用功,用自己的善良和真诚要求自己、对待待别人,我们就会积小善为大善,积小胜为大胜,积平凡为伟大。眼下母亲颂活动正在开展,这不是一种形式,希望同学们用真心体会母爱,用诚心歌颂母爱,用实心报答母爱。
最后让我们携起手行动起来,把五四精神发扬光大,努力实践“求知、求真、求实”“与人为善,善待人生”,为构建和谐校园而努力奋斗。
万般有罪,爱国无罪。历史不是一页书签,历史不是已成为化石的过去,更不只是时间长河中一段被截取的孤立的场景;历史是祖先的脚印,是一艘摆渡华夏民族的巨轮,是一个民族曾经的精神符号的记忆。历史是一段段螺旋上升以助我们民族抵达一个又一个高度的阶梯??既是如此,我们何不利用这笔宝贵的资源和财富,吸取其中的教训,在逝去的民族精神的符号中找寻我们尚未完全汲取的记忆?
李大钊说过:“人生的目标在于发展自己的生命,可是也有为发展必须牺牲生命的时候。因为平凡的发展,有时不如壮烈的牺牲足以延长生命的音响和光华。”
重温过这段历史,对于五四运动的精神,可以理解成为对科学民主的追求,也可以理解成为爱国自救的精神。但不管怎样的理解,有一点是公认的,那就是青年学生对国家的热爱,对真理和公平正义的追求,还有就是对黑暗和强权的不屈。而这些,对于今天的中国来说,依然有着重要的意义,因为如果年轻人对于自己的国家未来发展不关心,对于生活的这个社会中存在的不公正视而不见,对于强权心存畏惧的话,一个渴望发展的国家和民族就缺乏希望。
我们可以说一口流利的英语,但我更喜铿锵有力的中国话;
我们虽然喜欢情人节里的玫瑰巧克力,但我更喜欢“春节”“中秋”中国节;
我们是非主流,但我心中流淌的是中国血!
我想起了***总书记在五四运动八十周年纪念大会上的讲话,他说:“五四运动树立了一座推动中国历史进步的丰碑。五四运动也孕育了爱国、进步、民主、科学的伟大精神。五四精神的核心,是伟大的爱国主义。在五四运动中和五四时期,革命青年为救亡图存、振兴中华奔走呼号,奋不顾身,表现出了高尚的爱国情操和大无畏的革命英雄主义。五四运动所体现的爱国主义精神,是中华民族百折不挠、自强不息的民族精神的生动写照。这种历久弥新的伟大爱国主义精神,是我国几千年来发展和进步的重要力量源泉。所有的中华儿女都应万分珍视、大力弘扬这个宝贵的精神财富。
“五四”精神是启蒙与救亡的自觉广泛的统一;是知识分子与劳动群众的统一;是刻苦耐劳的精神与进取创新的精神的统一;是独立自主的精神与无私奉献精神的统一。
作为跨越世纪的一代人有责任将自己即将送走的世纪中所积累的精神遗产带进新世纪,五四精神就属于这样的精神遗产。因此,我们不但应当继承五四精神,而且应当弘扬五四精神。
我们当代青年,代表着祖国的希望,是现代社会的建设者,弘扬“五四”精神更加紧迫,“五四”精神也被赋予了新的意义。大家都知道八荣八耻吧以热爱祖国为荣,以危害祖国为耻;以服务人民为荣,以背离人民为耻;以崇尚科学为荣,以愚昧无知为耻;以辛勤劳动为荣,以好逸恶劳为耻;以团结互助为荣,以损人利己为耻以诚实守信为荣,以见利忘义为耻以遵纪守法为荣,以违法乱纪为耻;以艰苦奋斗为荣,以骄奢淫逸为耻。
民主潮流,大势所趋,顺者昌,逆者亡。人权、民主,九十年前,就是我们的先贤追求的目标,今天,我们仍在不断的追求之中。
90年前的今天,3000多北京学生高呼着“外争国权,内惩国贼”、“取消卖国的二十一条”、“誓死收回青岛”、“拒绝合约签字”等口号,游行示威、激慨万分的学生们火烧赵家楼!痛打章宗祥!随后掀起了 3
全国性的抵抗活动,工人罢工,商人忍痛罢市,当执政府为了平息甚至向一群手无寸铁的大学生开***!即使这样也没能扑灭这群爱国青年的一腔热血。
万般有罪,爱国无罪。历史不是一页书签,历史不是已成为化石的过去,更不只是时间长河中一段被截取的孤立的场景;历史是祖先的脚印,是一艘摆渡华夏民族的巨轮,是一个民族曾经的精神符号的记忆。历史是一段段螺旋上升以助我们民族抵达一个又一个高度的阶梯??既是如此,我们何不利用这笔宝贵的资源和财富,吸取其中的教训,在逝去的民族精神的符号中找寻我们尚未完全汲取的记忆?
李大钊说过:“人生的目标在于发展自己的生命,可是也有为发展必须牺牲生命的时候。因为平凡的发展,有时不如壮烈的牺牲足以延长生命的音响和光华。”
重温过这段历史,对于五四运动的精神,可以理解成为对科学民主的追求,也可以理解成为爱国自救的精神。但不管怎样的理解,有一点是公认的,那就是青年学生对国家的热爱,对真理和公平正义的追求,还有就是对黑暗和强权的不屈。而这些,对于今天的中国来说,依然有着重要的意义,因为如果年轻人对于自己的国家未来发展不关心,对于生活的这个社会中存在的不公正视而不见,对于强权心存畏惧的话,一个渴望发展的国家和民族就缺乏希望。
作为跨越世纪的一代人有责任将自己即将送走的世纪中所积累的精神遗产带进新世纪,五四精神就属于这样的精神遗产。因此,我们不但应当继承五四精神,而且应当弘扬五四精神。
我们当代青年,代表着祖国的希望,是现代社会的建设者,弘扬“五四”精神更加紧迫,“五四”精神也被赋予了新的意义。大家都知道八荣八耻吧以热爱祖国为荣,以危害祖国为耻;以服务人民为荣,以背离人民为耻;以崇尚科学为荣,以愚昧无知为耻;以辛勤劳动为荣,以好逸恶劳为耻;以团结互助为荣,以损人利己为耻以诚实守信为荣,以见利忘义为耻以遵纪守法为荣,以违法乱纪为耻;以艰苦奋斗为荣,以骄奢淫逸为耻。
五四运动距今天已整整九十年,然而,五四时期许多先知的呐喊犹在耳边,爱国、进步、民主、科学的大旗犹在中国上空高高飘扬。
《演讲与口才》形考任务二 一、单项选择(只有一个***是正确的,多选、错选均不得分(每题2分,共20分)) 1、关于演讲稿的作用,下列哪项说法是错误的。(
A、 能够对选材和提纲的实践性进行检验,进一步保证内容的完善。
B、 避免临场斟酌词句,增强语言的感染力。
C、 保证思路畅通,帮助消除怯场心理。
D、 限制演讲思维,使演讲变得不畅。
2、下列哪个选项不属于即兴演讲的特点。( ) (2分)
A、 临场性
B、 敏捷性
C、 简练性
D、 准备性
3、关于演讲稿的开头,下列哪项选项是错误的。(
A、 “善于始者,成功已半。”
B、 开头需要牢牢抓住听众的兴头。
C、 好的开头是成功的一半。
D、 开头并不重要。
4、关于演讲稿的结构,下面哪项不属于演讲稿的构成部分。(
5、即兴演讲需要反复训练,有两种训练方法:( )(2分)
A、 注意积累材料,加强思维能力训练
B、 注意积累材料,博闻强记
C、 加强思维能力训练,提高心理素质
D、 提高心理素质,积累材料
6、鲁迅在《未有天才之前》的演讲中这样讲道:“有一回,拿破仑过阿尔卑斯山,说:‘我比阿尔卑斯山还要高!’这何等英伟!然而不要忘记他后面跟着许多兵;倘若没有兵,那只有被山那面的敌人捉住或者赶回,他的举动、言语,若离了英雄的界线,要归入疯子一类了。所以,我想,在要求天才的产生之前,应该先要求可以使天才生长的民众。”这种演讲方式属于( )技巧。 (2分)
A、 悬念吸引,呼应作答
B、 欲擒故纵,出奇制胜
C、 主动出击,先声夺人
D、 委婉风趣,曲径通幽
7、演讲稿的修改过程中,修改材料是重要的一个环节,主要有“增”、“删”、“( )”三种方法。(2分)
8、“今天我给大家带来了一件特别的礼物。(举起一个小铜盒)??”这种表述方式属于演讲的哪种开头形式?( ) (2分)
A、 抒性式
B、 示物式
C、 引用式
D、 提问式
9、“长江在哭泣,黄河在哀号。广大的中国土地上,多少人流离失所,妻离子散??”这种表述方式,属于( )词格。(2分)
10、一篇演讲稿中,( )是统帅全篇的灵魂。(2分)
二、简答(简答题,并作出分析说明(每题10分,共40分)) 1、演讲的策略与技巧有哪些?(10分)
5 包含总结汇报、专业文献、资格考试、word文档、应用文书、办公文档、文档下载以及2014电大《演讲与口才》形考作业一至五***等内容。本文共3页
相关内容搜索详解iOS中多线程app开发的GCD队列的使用
作者:文顶顶
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了详解iOS中多线程app开发的GCD队列的使用,代码基于传统的Objective-C,需要的朋友可以参考下
GCD的基本使用
一、主队列介绍
主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行。
提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程。
获取主队列的方式:
&dispatch_queue_t queue=dispatch_get_main_queue();
(1)使用异步函数执行主队列中得任务,代码示例:
//& YYViewController.m
//& 12-GCD的基本使用(主队列)
//& Created by 孔医己 on 14-6-25.
//& Copyright (c) 2014年 itcast. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
&&& //打印主线程
&&&& NSLog(@"打印主线程--%@", [NSThread mainThread]);
&&& //1.获取主队列
&&& dispatch_queue_t queue=dispatch_get_main_queue();
&&& //2.把任务添加到主队列中执行
&&& dispatch_async(queue, ^{
&&&&&&& NSLog(@"使用异步函数执行主队列中的任务1--%@",[NSThread currentThread]);
&&& dispatch_async(queue, ^{
&&&&&&& NSLog(@"使用异步函数执行主队列中的任务2--%@",[NSThread currentThread]);
&&& dispatch_async(queue, ^{
&&&&&&& NSLog(@"使用异步函数执行主队列中的任务3--%@",[NSThread currentThread]);
执行效果:
(2)使用同步函数,在主线程中执行主队列中得任务,会发生死循环,任务无法往下执行。示意图如下:
二、基本使用
任务1和任务2是在主线程执行还是子线程执行,还是单独再开启一个新的线程?
//& YYViewController.m
//& 13-GCD基本使用(问题)
//& Created by 孔医己 on 14-6-25.
//& Copyright (c) 2014年 itcast. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
&&& //开启一个后台线程,调用执行test方法
&&& [self performSelectorInBackground:@selector(test) withObject:nil];
-(void)test
&&& NSLog(@"当前线程---%@",[NSThread currentThread]);
&&& dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //异步函数
&&& dispatch_async(queue, ^{
&&&&&&& NSLog(@"任务1所在的线程----%@",[NSThread currentThread]);
&&& //同步函数
&&& dispatch_sync(queue, ^{
&&&&&&& NSLog(@"任务2所在的线程----%@",[NSThread currentThread]);
打印结果:
2.开启子线程,加载图片
//& YYViewController.m
//& 14-GCD基本使用(下载图片)
//& Created by 孔医己 on 14-6-25.
//& Copyright (c) 2014年 itcast. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageV
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& //1.获取一个全局串行队列
&&& dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //2.把任务添加到队列中执行
&&& dispatch_async(queue, ^{
&&&&&&& //打印当前线程
&&&&&&& NSLog(@"%@",[NSThread currentThread]);
&&&&& //3.从网络上下载图片
&&&&&&& NSURL *urlstr=[NSURL URLWithString:@"http://h./baike/w%3D268/sign=30b3fb747b310a55c424d9f28fe30e924b899aab11f950a7b.jpg"];
&&&&&&& NSData *data=[NSData dataWithContentsOfURL:urlstr];
&&&&&&& UIImage *image=[UIImage imageWithData:data];
&&&&&&& //提示
&&&&&&& NSLog(@"图片加载完毕");
&&&&&&& //4.回到主线程,展示图片
&&&&&&& [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
显示效果:
打印结果:
要求使用GCD的方式,在子线程加载图片完毕后,主线程拿到加载的image刷新UI界面。
//& YYViewController.m
//& 14-GCD基本使用(下载图片)
//& Created by 孔医己 on 14-6-25.
//& Copyright (c) 2014年 itcast. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageV
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
//当手指触摸屏幕的时候,从网络上下载一张图片到控制器的view上显示
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& //1.获取一个全局串行队列
&&& dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //2.把任务添加到队列中执行
&&& dispatch_async(queue, ^{
&&&&&&& //打印当前线程
&&&&&&& NSLog(@"%@",[NSThread currentThread]);
&&&&& //3.从网络上下载图片
&&&&&&& NSURL *urlstr=[NSURL URLWithString:@"http://h./baike/w%3D268/sign=30b3fb747b310a55c424d9f28fe30e924b899aab11f950a7b.jpg"];
&&&&&&& NSData *data=[NSData dataWithContentsOfURL:urlstr];
&&&&&&& UIImage *image=[UIImage imageWithData:data];
&&&&&&& //提示
&&&&&&& NSLog(@"图片加载完毕");
&&&&&&& //4.回到主线程,展示图片
//&&&&&&& [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
&&&&&&& dispatch_async(dispatch_get_main_queue(), ^{
&&&&&&&&&&& self.imageView.image=
&&&&&&&&&&& //打印当前线程
&&&&&&&&&&& NSLog(@"%@",[NSThread currentThread]);
&&&&&&& });
打印结果:
好处:子线程中得所有数据都可以直接拿到主线程中使用,更加的方便和直观。
三、线程间通信
从子线程回到主线程
dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 执⾏耗时的异步操作...
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主线程,执⾏UI刷新操作
GCD的常见用法
一、延迟执行
iOS常见的延时执行有2种方式
(1)调用NSObject的方法
[self performSelector:@selector(run) withObject:nil afterDelay:2.0];
// 2秒后再调用self的run方法
(2)使用GCD函数
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
&&& // 2秒后异步执行这里的代码...
第一种方法,该方法在那个线程调用,那么run就在哪个线程执行(当前线程),通常是主线程。
[self performSelector:@selector(run) withObject:nil afterDelay:3.0];
说明:在3秒钟之后,执行run函数
代码示例:
//& YYViewController.m
//& 01-GCD的常见使用(延迟执行)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
&&& NSLog(@"打印线程----%@",[NSThread currentThread]);
&&& //延迟执行
&&& //第一种方法:延迟3秒钟调用run函数
&&& [self performSelector:@selector(run) withObject:nil afterDelay:2.0];
-(void)run
&&& NSLog(@"延迟执行----%@",[NSThread currentThread]);
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& //在异步函数中执行
&&& dispatch_queue_t queue = dispatch_queue_create("wendingding", 0);
&&& dispatch_sync(queue, ^{
&&&&&&& [self performSelector:@selector(test) withObject:nil afterDelay:1.0];
&&& NSLog(@"异步函数");
-(void)test
&&& NSLog(@"异步函数中延迟执行----%@",[NSThread currentThread]);
说明:如果把该方法放在异步函数中执行,则方法不会被调用(BUG?)
第二种方法,
&dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
&&&&&& //延迟执行的方法
说明:在5秒钟之后,执行block中的代码段。
参数说明:
什么时间,执行这个队列中的这个任务。
代码示例:
//& YYViewController.m
//& 02-GCD常见使用(延迟执行2)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
&&& NSLog(@"打印当前线程---%@",& [NSThread currentThread]);
&&& //延迟执行,第二种方式
&&&& //可以安排其线程(1),主队列
&&&& dispatch_queue_t queue= dispatch_get_main_queue();
&&& dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC)), queue, ^{
&&&&&&& NSLog(@"主队列--延迟执行------%@",[NSThread currentThread]);
&&& //可以安排其线程(2),并发队列
&&& //1.获取全局并发队列
&&& dispatch_queue_t queue1= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //2.计算任务执行的时间
&&& dispatch_time_t when=dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5.0 * NSEC_PER_SEC));
&&& //3.会在when这个时间点,执行queue中的这个任务
&&& dispatch_after(when, queue1, ^{
&&&&&&& NSLog(@"并发队列-延迟执行------%@",[NSThread currentThread]);
延迟执行:不需要再写方法,且它还传递了一个队列,我们可以指定并安排其线程。
如果队列是主队列,那么就在主线程执行,如果队列是并发队列,那么会新开启一个线程,在子线程中执行。
二、一次性代码
1.实现一次性代码
需求:点击控制器只有第一次点击的时候才打印。
实现代码:
//& YYViewController.m
//& 03-GCD常见使用(一次性代码)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@property(nonatomic,assign) BOOL
@implementation YYViewController
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& if (_log==NO) {
&&&&&&& NSLog(@"该行代码只执行一次");
&&&&&&& _log=YES;
缺点:这是一个对象方法,如果又创建一个新的控制器,那么打印代码又会执行,因为每个新创建的控制器都有自己的布尔类型,且新创建的默认为NO,因此不能保证改行代码在整个程序中只打印一次。
2.使用dispatch_once一次性代码
使用dispatch_once函数能保证某段代码在程序运行过程中只被执行1次
static dispatch_once_t onceT
dispatch_once(&onceToken, ^{
&&& // 只执行1次的代码(这里面默认是线程安全的)
整个程序运行过程中,只会执行一次。
代码示例:
//& YYViewController.m
//& 03-GCD常见使用(一次性代码)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
@interface YYViewController ()
@property(nonatomic,assign) BOOL
@implementation YYViewController
//-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
//&&& if (_log==NO) {
//&&&&&&& NSLog(@"该行代码只执行一次");
//&&&&&&& _log=YES;
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& static dispatch_once_t onceT
&&& dispatch_once(&onceToken, ^{
&&&&&&& NSLog(@"该行代码只执行一次");
效果(程序运行过程中,打印代码只会执行一次):
三、队列组
需求:从网络上下载两张图片,把两张图片合并成一张最终显示在view上。
1.第一种方法
代码示例:
//& YYViewController.m
//& 04-GCD基本使用(队列组下载图片)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
//宏定义全局并发队列
#define global_quque&&& dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
//宏定义主队列
#define main_queue&&&&&& dispatch_get_main_queue()
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& //获取全局并发队列
//&&& dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //获取主队列
//&&& dispatch_queue_t queue= dispatch_get_main_queue();
//&&& 图片1:http://d./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a1fefafcd/cefc1e178a82bd738da.jpg
//&&& 图片2:http://h./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56fe30e924b899aab11f950a7b.jpg
&&& dispatch_async(global_quque, ^{
&&&&&&& //下载图片1
&&&&&& UIImage *image1= [self imageWithUrl:@"http://d./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a1fefafcd/cefc1e178a82bd738da.jpg"];
&&&&&&& NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
&&&&&&& //下载图片2
&&&&&& UIImage *image2= [self imageWithUrl:@"http://h./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56fe30e924b899aab11f950a7b.jpg"];
&&&&&&& NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
&&&&&&& //回到主线程显示图片
&&&&&&& dispatch_async(main_queue, ^{
&&&&&&&&&&&& NSLog(@"显示图片---%@",[NSThread currentThread]);
&&&&&&&&&&& self.imageView1.image=image1;
&&&&&&&&&&& self.imageView2.image=image2;
&&&&&&&&&&& //合并两张图片
&&&&&&&&&&& UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
&&&&&&&&&&& [image1 drawInRect:CGRectMake(0, 0, 100, 100)];
&&&&&&&&&&& [image2 drawInRect:CGRectMake(100, 0, 100, 100)];
&&&&&&&&&&& self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
&&&&&&&&&&& //关闭上下文
&&&&&&&&&&& UIGraphicsEndImageContext();
&&&&&&&&&&&&&& NSLog(@"图片合并完成---%@",[NSThread currentThread]);
&&&&&&& });
&&&&&&& //
//封装一个方法,传入一个url参数,返回一张网络上下载的图片
-(UIImage *)imageWithUrl:(NSString *)urlStr
&&& NSURL *url=[NSURL URLWithString:urlStr];
&&& NSData *data=[NSData dataWithContentsOfURL:url];
&&& UIImage *image=[UIImage imageWithData:data];
显示效果:
打印查看:
问题:这种方式的效率不高,需要等到图片1.图片2都下载完成后才行。
提示:使用队列组可以让图片1和图片2的下载任务同时进行,且当两个下载任务都完成的时候回到主线程进行显示。
2.使用队列组解决
创建一个组
开启一个任务下载图片1
&开启一个任务下载图片2
同时执行下载图片1\下载图片2操作
等group中的所有任务都执行完毕, 再回到主线程执行其他操作
//& YYViewController.m
//& 04-GCD基本使用(队列组下载图片)
//& Created by apple on 14-6-25.
//& Copyright (c) 2014年 itcase. All rights reserved.
#import "YYViewController.h"
//宏定义全局并发队列
#define global_quque&&& dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
//宏定义主队列
#define main_queue&&&&&& dispatch_get_main_queue()
@interface YYViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *imageView1;
@property (weak, nonatomic) IBOutlet UIImageView *imageView2;
@property (weak, nonatomic) IBOutlet UIImageView *imageView3;
@implementation YYViewController
- (void)viewDidLoad
&&& [super viewDidLoad];
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
&&& //&&& 图片1:http://d./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a1fefafcd/cefc1e178a82bd738da.jpg
&&& //&&& 图片2:http://h./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56fe30e924b899aab11f950a7b.jpg
&&& //1.创建一个队列组
&&&&&&& dispatch_group_t group = dispatch_group_create();
&&& //2.开启一个任务下载图片1
&&& __block UIImage *image1=
&&& dispatch_group_async(group, global_quque, ^{
&&&&&&& image1= [self imageWithUrl:@"http://d./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=2b9a1fefafcd/cefc1e178a82bd738da.jpg"];
&&&&&&& NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
&&& //3.开启一个任务下载图片2
&&& __block UIImage *image2=
&&& dispatch_group_async(group, global_quque, ^{
&&&&&&& image2= [self imageWithUrl:@"http://h./baike/c0%3Dbaike80%2C5%2C5%2C80%2C26/sign=f47fd63ca41ea8d39e2f7c56fe30e924b899aab11f950a7b.jpg"];
&&&&&&& NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
&&& //同时执行下载图片1\下载图片2操作
&& //4.等group中的所有任务都执行完毕, 再回到主线程执行其他操作
&&& dispatch_group_notify(group,main_queue, ^{
&&&&&&& NSLog(@"显示图片---%@",[NSThread currentThread]);
&&&&&&& self.imageView1.image=image1;
&&&&&&& self.imageView2.image=image2;
&&&&&&& //合并两张图片
&&&&&&& //注意最后一个参数是浮点数(0.0),不要写成0。
&&&&&&& UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
&&&&&&& [image1 drawInRect:CGRectMake(0, 0, 100, 100)];
&&&&&&& [image2 drawInRect:CGRectMake(100, 0, 100, 100)];
&&&&&&& self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
&&&&&&& //关闭上下文
&&&&&&& UIGraphicsEndImageContext();
&&&&&&& NSLog(@"图片合并完成---%@",[NSThread currentThread]);
-(void)download2image
&&& //获取全局并发队列
//&&& dispatch_queue_t queue= dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
&&& //获取主队列
//&&& dispatch_queue_t queue= dispatch_get_main_queue();
&&& dispatch_async(global_quque, ^{
&&&&&&& //下载图片1
&&&&&& UIImage *image1= [self imageWithUrl:@"/z/resource/r/image//2afc7cfe3a7b1.jpg"];
&&&&&&& NSLog(@"图片1下载完成---%@",[NSThread currentThread]);
&&&&&&& //下载图片2
&&&&&& UIImage *image2= [self imageWithUrl:@"/z/resource/r/image//2afc7cfe3a7b1.jpg"];
&&&&&&& NSLog(@"图片2下载完成---%@",[NSThread currentThread]);
&&&&&&& //回到主线程显示图片
&&&&&&& dispatch_async(main_queue, ^{
&&&&&&&&&&&& NSLog(@"显示图片---%@",[NSThread currentThread]);
&&&&&&&&&&& self.imageView1.image=image1;
&&&&&&&&&&& self.imageView2.image=image2;
&&&&&&&&&&& //合并两张图片
&&&&&&&&&&& UIGraphicsBeginImageContextWithOptions(CGSizeMake(200, 100), NO, 0.0);
&&&&&&&&&&& [image1 drawInRect:CGRectMake(0, 0, 100, 100)];
&&&&&&&&&&& [image2 drawInRect:CGRectMake(0, 0, 100, 100)];
&&&&&&&&&&& self.imageView3.image=UIGraphicsGetImageFromCurrentImageContext();
&&&&&&&&&&& //关闭上下文
&&&&&&&&&&& UIGraphicsEndImageContext();
&&&&&&&&&&&&&& NSLog(@"图片合并完成---%@",[NSThread currentThread]);
&&&&&&& });
&&&&&&& //
//封装一个方法,传入一个url参数,返回一张网络上下载的图片
-(UIImage *)imageWithUrl:(NSString *)urlStr
&&& NSURL *url=[NSURL URLWithString:urlStr];
&&& NSData *data=[NSData dataWithContentsOfURL:url];
&&& UIImage *image=[UIImage imageWithData:data];
打印查看(同时开启了两个子线程,分别下载图片):
2.补充说明
有这么1种需求:
首先:分别异步执行2个耗时的操作
其次:等2个异步操作都执行完毕后,再回到主线程执行操作
如果想要快速高效地实现上述需求,可以考虑用队列组
dispatch_group_t group =& dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&&& // 执行1个耗时的异步操作
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
&&& // 执行1个耗时的异步操作
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
&&& // 等前面的异步操作都执行完毕后,回到主线程...
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具