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多线程开发
概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...
随机推荐
- Linux高级编程--08.线程概述
线程 有的时候,我们需要在一个基础中同时运行多个控制流程.例如:一个图形界面的下载软件,在处理下载任务的同时,还必须响应界面的对任务的停止,删除等控制操作.这个时候就需要用到线程来实现并发操作. 和信 ...
- 关于C# Math 处理奇进偶不进
话说,最近一次系统维护 用JS读取导入Excel中的实验数据,出现被自动四舍五入.后来到客户现场听客户反馈 Excel实验数据要求 奇进偶不进. 关于 奇进偶不进 产生的由来:从统计学的角度,“奇进 ...
- 爬虫技术 -- 进阶学习(七)简单爬虫抓取示例(附c#代码)
这是我的第一个爬虫代码...算是一份测试版的代码.大牛大神别喷... 通过给定一个初始的地址startPiont然后对网页进行捕捉,然后通过正则表达式对网址进行匹配. List<string&g ...
- SQL Server技术问题之游标优缺点
分类: MS SQL SERVER 支持三种类型的游标:Transact_SQL 游标,API 服务器游标和客户游标. (1) Transact_SQL 游标 Transact_SQL 游标是由DEC ...
- CentOS6.5菜鸟之旅:识别NTFS分区
一.前言 CentOS默认时不能识别NTFS分区的,需要那么需要安装fuse-ntfs-3g来处理了. 二.安装fuse-ntfs-3g yum install fuse-ntfs-3g
- IntelliTrace简介
解决无法复现bug所使用的策略是在遇到bug时捕获尽可能多的信息,在使用IntelliTrace进行调试时可以充分利用这些信息.最令人称道的一个功能在于bug本身可以自动修复. 打开IntelliTr ...
- 重构第23天 引用参数对象(Introduce Parameter Object)
理解:有时候我们的一个方法,需要很多个参数,太多参数,不易阅读和理解,我们就可以把多个参数封装成一个对象. 详解: 重构前代码: public class Registration { public ...
- 自定义ConfigurationSection,创建多个嵌套的ConfigurationElementCollection节点
由于接口地址都是固定的,所以想到使用自定义节点,来将接口都配置到web.config中. 很快,v1.0版本出炉: public class RequestConfigSection : Config ...
- 使用mvc3实现ajax跨域
ajax跨域一般两种方式 1:cors,2:jsonp, 1:cors jsonp是get形式,承载的信息量有限,所以信息量较大时CORS是不二选择 在请求消息头添头 Access-Control ...
- 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性
[源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...