iOS多线程邂逅
.线程之间的通信 //有一个特别耗时的操作,比如说网络请求,开启子线程去请求网络,我们一般是要在主线程更新UI,如何从子线程跳转到主线程? #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (IBAction)downLoadImage:(id)sender { [self performSelectorInBackground:@selector(loadImage) withObject:nil]; } - (void)loadImage { NSLog(@"loadImage - %@",[NSThread currentThread]); NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg"; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; UIImage * image = [UIImage imageWithData:data]; //waitUntilDone // [self performSelectorOnMainThread:@selector(changeMainThread:) withObject:image waitUntilDone:NO]; // [self performSelector:@selector(changeMainThread:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES]; [self.imageView performSelector:@selector(setImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:NO]; // waitUntilDone:是什么意思? // YES:等待loadImage:这个方法执行完毕之后,再执行当前线程后续的操作 // NO:不等待loadImage:这个方法执行完毕,就执行当前线程后续的操作 NSLog(@"waitUntilDone"); // self.imageView.image = image; } .GCD基础 核心概念 任务:block里需要执行的操作 队列:把任务添加进入队列中,按照先进先出的原则来执行任务 串行队列:一个一个的执行 并行队列:可以让多个任务并发(同时)执行(自动开启多个线程同时执行任务)并发功能只有在异步(dispatch_async)函数下才有效。 同步任务:不会开辟新的线程,任务在当前的线程中执行,同时任务是立刻执行 异步任务:会开辟新的线程(主队列不可以),任务在新开辟的线程执行(主队列在主线程中执行),不是立刻 执行任务 同步任务串行队列:不会开启新的线程,当前的线程中顺序执行任务 同步任务并行队列:不会开启新的线程,当前的线程中执行任务,立刻执行任务 异步任务串行队列:会开辟一个新的线程,在新开辟的线程中执行任务,不是立刻执行 异步任务并行队列:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行 主队列(特殊的串行队列):任务只会在主线程中调度,不会开辟新的线程(一般用于刷新UI) 异步任务主队列:不会开辟新的线程,当前的线程中执行任务,不会立刻执行任务 同步任务主队列:死锁 全局队列(并行队列):全局队列供给应用程序共享,可以设置优先级 开辟新的线程:由任务决定,同步任务不会开辟新的线程,异步任务会开辟新的线程(主队列不会开辟新的线程) 开辟多少线程:由队列决定,串行队列只会开启一个线程,并行队列会开辟多个线程,具体多少个由任务的数量和GCD的底层来决定的 */ - (void)gcdTest6 { dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@""); //在主队列里执行同步操作,产生死锁 //原因:同步线程等待主线程结束,才会执行任务。主线程等待同步立即执行,才会执行下一个任务。 dispatch_sync(queue, ^{ NSLog(@""); }); NSLog(@""); } - (void)gcdTest5 { // 主队列就是一种特殊的串行队列 // 特点:专门负责在主线程上调度任务,不会再子线程中去调度任务,无论是同步或异步中调用任务都只会在主线程上面执行 dispatch_queue_t queue = dispatch_get_main_queue(); NSLog(@"开始"); for (NSInteger i = ; i < ; i ++) { //主队列执行异步操作,异步操作有一个等待的过程 dispatch_async(queue, ^{ NSLog(@"%@",[NSThread currentThread]); }); } NSLog(@"结束"); } //并发队列:多个线程同时执行 //同步操作:不会开启新的线程 //执行结果:不会开启新的线程,立即执行 - (void)gcdTest4 { dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT); NSLog(@"开始"); for (NSInteger i = ; i < ; i ++ ) { dispatch_sync(queue, ^{ NSLog(@"%@,%@",[NSThread currentThread],@(i)); }); } NSLog(@"结束"); } //并发队列:多个线程同时执行 //异步操作:会开启新的线程 //执行结果:会开辟新的线程,在新开辟的线程中执行任务,任务的完成顺序是无序的,不是立刻执行 - (void)gcdTest3 { //开启并发队列 dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", DISPATCH_QUEUE_CONCURRENT); NSLog(@"开始"); for (NSInteger i = ; i < ; i ++ ) { //执行异步操作 dispatch_async(queue, ^{ NSLog(@"%@",[NSThread currentThread]); }); } NSLog(@"结束"); } //串行队列:一个一个执行 //异步操作:会开启新的线程 //执行结果:开启一个新的线程,在新开辟的线程中执行任务,不是立刻执行 - (void)gcdTest2 { dispatch_queue_t queue = dispatch_queue_create("com.bjsxt", NULL); NSLog(@"开始"); for (NSInteger i = ; i < ; i ++ ) { //异步请求 dispatch_async(queue, ^{ NSLog(@"%@,%@",[NSThread currentThread],@(i)); }); } NSLog(@"结束"); } //串行队列:一个一个执行 //同步操作:不开启新的线程 //执行结果:不开启新的线程,一个一个顺序执行 - (void)gcdTest1 { //label:队列名 //attr:队列属性(串行,并发) //DISPATCH_QUEUE_SERIAL 串行 //DISPATCH_QUEUE_CONCURRENT 并发 //#define DISPATCH_QUEUE_SERIAL NULL dispatch_queue_t queue = dispatch_queue_create("com.bjsxt",DISPATCH_QUEUE_SERIAL); NSLog(@"开始"); //同步操作 //操作任务:block dispatch_sync(queue, ^{ //打印当前线程 NSLog(@"%@",[NSThread currentThread]); }); NSLog(@"结束"); } .GCD线程之间通信 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (IBAction)downLoadImage:(id)sender { NSLog(@"%@",[NSThread currentThread]); //获取全局队列 dispatch_queue_t queue = dispatch_get_global_queue(, ); //执行异步操作 dispatch_async(queue, ^{ NSLog(@"%@",[NSThread currentThread]); NSString * urlString = @"http://design.yesky.com/uploadImages/2009/335/20091201140951681.jpg"; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]]; UIImage * image = [UIImage imageWithData:data]; //返回主线程更新UI dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"%@",[NSThread currentThread]); self.imageView.image = image; }); }); } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //同步操作用途 dispatch_queue_t queue = dispatch_get_global_queue(, ); dispatch_sync(queue, ^{ NSLog(@"登录"); }); dispatch_async(queue, ^{ NSLog(@"下载斗破苍穹"); }); dispatch_async(queue, ^{ NSLog(@"下载大主宰"); }); }
iOS多线程邂逅的更多相关文章
- iOS多线程主题
下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...
- iOS多线程技术方案
iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...
- iOS 多线程GCD的基本使用
<iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...
- iOS多线程到底不安全在哪里?
iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...
- iOS多线程的详情使用示例--简进祥
大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...
- iOS多线程
关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...
- iOS多线程学习及总结
能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一. iOS有三种多线程编程的技术,分别是: 1. NSThread 2. Cocoa NSOp ...
- iOS多线程杂论
iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...
- iOS多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
随机推荐
- Physical Based Shading in Unreal Engine 3
Roughness = 0.1roughness = 0.4roughness = 0.7roughness = 0.999 以上的Fresnel 0° = {1.0,0.86.0.57}(PS: 近 ...
- 移动审批App开发总结
公司新需求要在手机上进行审批. 现在开发完成了. 总结:1.初步把公司的工作流模块做成RPC服务,公共服务可以进行调用. 2.服务分层,每个App的页面对应一个服务端的接口,作为前端控制器,用来从更低 ...
- shell 和awk性能对比
time for ((i=0;i<10000;i++)) do ((sum+=i)); done real 0m0.086suser 0m0.079ssys 0m0.007s ...
- C10K问题渣翻译
The C10K problem [Help save the best Linux news source on the web -- subscribe to Linux Weekly News! ...
- chrome 插件 vimium 像操作vim一样的操作浏览器
感谢潘德龙同学推荐的插件非常好用整理出来一些常用快捷键记下,顺便分享! x 关闭当前页 GW 跳出浏览器 J 展示左边页签 K展示右边页签 j向下滚动 k向上滚动 /搜索 ?打开帮助 r 刷新当前页 ...
- HMM 自学教程(六)维特比算法
本系列文章摘自 52nlp(我爱自然语言处理: http://www.52nlp.cn/),原文链接在 HMM 学习最佳范例,这是针对 国外网站上一个 HMM 教程 的翻译,作者功底很深,翻译得很精彩 ...
- Python单元测试框架之pytest -- 生成测试报告
继续pytest单元测试框架的学习,pytest可以生成多种类型的测试报告.这一节就来学习pytest如何生成测试报告. 创建test_calss.py 测试用例文件,这里以测试该文件为例. #cod ...
- Koa – 更加强大的下一代 Node.js Web 框架
Koa 是 Express 的开发团队设计的下一代 Web 框架,其目的是为 Web 应用程序提供更小,更具表现力,更坚实的基础.Koa 没有核捆绑任何中间件,并提供了一套优雅的方法,使服务器端开 ...
- nginx 更新提示端口占用的解决办法
最近更新ubuntu下的nginx,报了以下的错误, [emerg]: bind() to 0.0.0.0:80 failed (98: Address already in use) 可以看到,80 ...
- sql server 查找包含字符串的对象
sql server 查找包含字符串的对象 SELECT sm.object_id, OBJECT_NAME(sm.object_id) AS object_name, o.type, o.type_ ...