粗糙的iOS笔记之线程—GCD
2014-03-12 20:53
344 查看
一、多线程以及相关问题
1.进程:一个应用程序配套一个进程
2.线程:线程负责执行代码,一个进程里可以有多个线程,默认情况下,程序开始 的时候只有一个主线程
3.CPU负责执行线程所读取的代码,CPU是以时间片来运行的,每个线程都会被分配一个时间片,
然后轮流执行,执行完继续分配时间片,否则挂起,等到下一次被唤醒继续执行。
并发:多个线程同时执行
多核:CPU有多个可以用于计算的核
二、多线程存在的原因
1.耗时操作、读取文件、读网络文件、计时器等会堵塞主线程。主程序被堵塞程序就会卡死,10秒之内系统就会关闭它
同步:Synchronize 一行一行执行单线程
顺序:单线程 无并发
异步:Asynchronize 多个线程同时执行多线程
乱序:多线程 有并发
三、多线程的用法
1.加锁机制
1)让一段代码只能有一个线程执行,知道这个线程解锁后,其它线程才能进来
self.condition = [[NSConditionalloc]init];
[self.conditionlock];
// 相关代码
[self.condition unlock];
以上代码等于 == @synchronized(self.condition)
{ }
2.执行队列
1)执行队列是一个处理并发问题的一个全新的思考模式,用来管理线程
(因为创建线程和为何线程需要大量的资源)
2)线程池 一个专门用于存放创建好的线程的地方
3)执行队列机理
1)Grand Center Dispatch 中央任务分发
2)以更简单的代码方式去处理OperationQueue 管理队列,可以快速的将一行代码异步执行
3)用法
给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!
从OC转移到swift:环境与变量
swift进阶可能值
swift枚举扩展泛型
类初始化属性方法
元组闭包
变量字符串集合循环
1.进程:一个应用程序配套一个进程
2.线程:线程负责执行代码,一个进程里可以有多个线程,默认情况下,程序开始 的时候只有一个主线程
3.CPU负责执行线程所读取的代码,CPU是以时间片来运行的,每个线程都会被分配一个时间片,
然后轮流执行,执行完继续分配时间片,否则挂起,等到下一次被唤醒继续执行。
并发:多个线程同时执行
多核:CPU有多个可以用于计算的核
二、多线程存在的原因
1.耗时操作、读取文件、读网络文件、计时器等会堵塞主线程。主程序被堵塞程序就会卡死,10秒之内系统就会关闭它
同步:Synchronize 一行一行执行单线程
顺序:单线程 无并发
异步:Asynchronize 多个线程同时执行多线程
乱序:多线程 有并发
三、多线程的用法
1.加锁机制
1)让一段代码只能有一个线程执行,知道这个线程解锁后,其它线程才能进来
self.condition = [[NSConditionalloc]init];
[self.conditionlock];
// 相关代码
[self.condition unlock];
以上代码等于 == @synchronized(self.condition)
{ }
2.执行队列
1)执行队列是一个处理并发问题的一个全新的思考模式,用来管理线程
(因为创建线程和为何线程需要大量的资源)
2)线程池 一个专门用于存放创建好的线程的地方
3)执行队列机理
- (void)run {
<span style="white-space:pre"> </span>// 创建操作 NSOperation * o1 = [NSBlockOperation blockOperationWithBlock:^{ [self loop]; }]; NSOperation * o2 = [NSBlockOperation blockOperationWithBlock:^{ [self loop]; }]; NSOperation * o3 = [NSBlockOperation blockOperationWithBlock:^{ [self loop]; }]; NSOperation * o4 = [NSBlockOperation blockOperationWithBlock:^{ [self loop]; }];
<span style="white-space:pre"> </span>// 创建队列 NSOperationQueue * operationQueue = [[NSOperationQueue alloc] init];
<span style="white-space:pre"> </span>// 添加操作 进入队列 [operationQueue addOperation:o1]; [operationQueue addOperation:o2]; [operationQueue addOperation:o3]; [operationQueue addOperation:o4]; // 同时有多个线程执行,如果赋值1,则只有一个线程来执行 operationQueue.maxConcurrentOperationCount = 4; [NSThread sleepForTimeInterval:10]; } - (void)loop { for (int i = 0; i < 100; i++) { NSLog(@"%d",i); } }3.GCD(Grand Center Dispatch)
1)Grand Center Dispatch 中央任务分发
2)以更简单的代码方式去处理OperationQueue 管理队列,可以快速的将一行代码异步执行
3)用法
// 获取系统默认的队列 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); // 把耗时操作放入队列 dispatch_async(queue, ^{ NSString * path = self.imagePaths[indexPath.row]; NSData * data = [NSData dataWithContentsOfURL:[NSURL URLWithString:path]]; UIImage * image = [UIImage 4000 imageWithData:data]; // 更新界面的操作由主线程来完成,子线程不能更改界面 dispatch_async(dispatch_get_main_queue(), ^{ cell.imageView.image = image; }); });
<span style="font-size:14px;"><strong>// 切记:子线程不能更改界面,更新界面的操作必须由主线程来完成 ;具体原因不明 可能与设计模式有关,有懂得麻烦解释一下 欢迎吐槽 谢谢!</strong></span>
给大家推荐一个swift视频教程,后续会不断更新,下载文件需要验证多次,有点耐心哦!
从OC转移到swift:环境与变量
swift进阶可能值
swift枚举扩展泛型
类初始化属性方法
元组闭包
变量字符串集合循环
相关文章推荐
- ios 多线程控制线程并发数、GCD之dispatch_group、GCD信号量
- iOS线程学习笔记
- iOS学习笔记10(4)—GCD介绍(四): 完结
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用
- 粗糙的iOS笔记四之绘制
- iOS 多线程学习笔记 —— GCD
- ios学习笔记:iosGCD的使用
- iOS GCD & NSOperation 对比~笔记
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(上)
- iOS 多线程编程<四、GCD线程间通信>
- iOS-线程之GCD---之GCD的几种常用常用的方法
- 粗糙的iOS笔记之数据存储
- ios 线程笔记(一)
- iOS学习笔记-----GCD 用法介绍
- iOS - GCD 之线程死锁
- [笔记]iOS开发之多线程GCD和NSOperation基本使用
- iOS学习笔记74- 完整详解GCD系列(三)dispatch_group
- iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用(下)
- ios笔记-- 多线程应该知道的那几件事 GCD NSThread NSOperation
- IOS线程数据篇3之多线程:NSThread NSOperation GCD(二)