iOS NSOperation 和 GCD区别
来源:互联网 发布:中维网络监控客户端 编辑:程序博客网 时间:2024/05/16 17:21
知识点
1.理解线程的概念
2.NSThread的使用
3.NSOperation的使用
4.GCD的使用
5.线程锁,线程安全 (我操作的时候 别人不能操作 ,之后再解锁)
线程的优点:可以增加执行效率,提高CPU办事效率
线程的缺点:会增加CPU负担,性能降低,增加程序设计的复杂程度 编写难度
===============================
1.多线程是一种实现多任务并发执行的技术,允许同时执行多个任务,能够更合理的利用CPU的资源,提高效率、防止用户界面卡顿。
在iOS中,所有的UI处理只能在主线程做。 一个进程里面至少有一个线程(即主线程 ) 每一个进程都有一个独立的应用空间,线程会临时分配一个空间,所以不能无限的开线程 UI操作都是在主线程里面,耗时的操作放到另一个线程,
(1)多线程的原理
同一时间,CPU只能处理1条线程,只有1条线程在工作(执行)
多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换)
如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象
思考:如果线程非常非常多,会发生什么情况?
CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源
每条线程被调度执行的频次会降低(线程的执行效率降低)
(2)多线程的优缺点
多线程的优点
能适当提高程序的执行效率
能适当提高资源利用率(CPU、内存利用率)
多线程的缺点
开启线程需要占用一定的内存空间(默认情况下,主线程占用1M,子线程占用512KB),如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多,CPU在调度线程上的开销就越大
程序设计更加复杂:比如线程之间的通信、多线程的数据共享
===============================
2.NSThread线程控制
1).创建线程,并自动执行
[NSThreaddetachNewThreadSelector:@selector(doSomeThing)toTarget:selfwithObject:nil];
2).创建线程,不自动执行
[[NSThreadalloc]initWithTarget:selfselector:@selector(doSomeThing)object:nil];
3).设置线程名 : thread.name =@"另一个线程";
4).执行线程 : [threadstart];
5).线程取消 :[threadcancel];
6).函数内获取当前线程 ;[NSThreadcurrentThread];
7).获取主线程 :[NSThreadmainThread];
8).线程休眠
[NSThreadsleepForTimeInterval:1.0f]; //休眠几秒
[NSThreadsleepUntilDate:date]; //休眠到指定时间
9).线程退出 :[NSThreadexit];
10).线程通信
[selfperformSelector:@selector(function)onThread:[NSThreadmainThread]withObject:nilwaitUntilDone:YES];
11)进程通信:
socket:Xmpp 进程之间的通信
===============================
3.NSOperation,是以任务为中心的一种多线程技术,并不直接管理线程
1).NSOperation是抽象父类,不要直接使用,而应该使用它的子类
NSInvocationOperation
[[NSInvocationOperationalloc]initWithTarget:selfselector:@selector(doSomeThing)object:nil];
NSBlockOperation
[NSBlockOperationblockOperationWithBlock:^{}];
添加任务间的依赖关系,前者依赖于后者的完成,也就是后者执行完,前者才能执行,依赖关系需要放在添加到队列之前设置
[invocation addDependency:blockOperation];
如果有必要,可以让Operation取消
[invocation cancel];
自定义Operation
1.继承NSOperation
2.重写main方法
2.NSOperationQueue,任务队列,NSOperation对象需要添加到队列里面才会执行
添加到队列里之后,自动会给每个NSOperation对象创建一个线程去执行
创建NSOperationQueue
[[NSOperationQueuealloc]init];
设置最大并发数
queue.maxConcurrentOperationCount =1;
添加任务到队列里
[queueaddOperation:blockOperation];
让队列里面,所有的Operation都取消
[queue cancelAllOperations];
获取当前线程对列
currentQueue
获取主线程对列
mainQueue
相对于GCD:
1,NSOperation拥有更多的函数可用,具体查看api。
2,在NSOperationQueue中,可以建立各个NSOperation之间的依赖关系。
3,有kvo,可以监测operation是否正在执行(isExecuted)、是否结束(isFinished),是否取消(isCanceld)。
4,NSOperationQueue可以方便的管理并发、NSOperation之间的优先级。
GCD主要与block结合使用。代码简洁高效。
GCD也可以实现复杂的多线程应用,也可以延迟执行,主要是建立个个线程时间的依赖关系这类的情况,但是需要自己实现相比NSOperation要复杂。
具体使用哪个,依需求而定。 从个人使用的感觉来看,比较合适的用法是:除了依赖关系尽量使用GCD,因为苹果专门为GCD做了性能上面的优化。
===============================
4.GCD是一套C语言的线程控制API,是NSOperation的底层实现,用Block来表示一个任务
分串联和并联
1).创建队列
dispatch_queue_create("QF Queue",DISPATCH_QUEUE_CONCURRENT);
2).系统的队列
dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);// 全局队列
dispatch_get_main_queue(); // 主线程队列
3).异步执行任务
dispatch_async(globalQuque, ^{});
4).创建分组
dispatch_group_create();
5).添加任务到分组,并执行
dispatch_group_async(group, globalQuque, ^{});
6).分组执行完的通知
dispatch_group_notify(group, mainQuque, ^{});
===============================
5.线程锁
1).方式1:_lock = [[NSLockalloc]init];
上锁: [_locktryLock];
解锁: [_lockunlock];
2).方式2:
.为了保证别人不再触碰单例 加锁:
@synchronized(self) {}
3)方式3: 和lock用法一样
_condition = [[NSConditionalloc]init];
上锁 : [_conditionlock];解锁 : [_conditionunlock];
面向过程:自己写
面向对象:请一些程序员来完成 分了各种模块来完成我得任务
注意:其实GCD也能达到设置最大迸发数的效果。利用串联,创建一个线程 之后把1 2 3 4 5 都放到这里,就是设置最大迸发数了。GCD应该也可以设置依赖关系的,就是说同样也是串联,先将1放进去 再将2放进去 类似就是这样的吧 ,具体的有什么问题也不是很清楚了,知道的话可以直接留言给我,谢谢!
- iOS NSOperation 和 GCD区别
- ios-GCD和NSOperation的区别
- iOS多线程NSThread/GCD/NSOperation区别和使用
- GCD和NSOperation的区别
- GCD和NSOperation的区别
- NSOperation 和 GCD 的区别
- GCD 和 NSOperation的区别
- 【iOS】多线程NSOperation 与 GCD的区别
- iOS开发-NSOperation与GCD区别
- iOS 多线程~NSThread、NSOperation 、GCD 技术区别
- [iOS学习]多线程之NSOperation和GCD
- iOS多线程之NSThread、NSOperation和GCD
- iOS多线程NSThread,NSOperation和GCD详解
- iOS 多线程~NSThread、NSOperation 、GCD 技术区别~思维导图
- GCD和NSOperation总结
- GCD和NSOperation总结
- NSOperation 和 GCD
- GCD和NSOperation对比
- 流行的几款代表性的软件自动化测试工具汇总简介
- axure原型设计之侧滑菜单
- 我是如何自学软件测试的
- QContextMenuEvent 上下文菜单(右键菜单)的操作
- 微信小程序 -- 后台接收数据为json
- iOS NSOperation 和 GCD区别
- 向AppStore提交应用因为IPv6问题被拒解决方案
- spring 工具类ResourceUtils 获取静态资源下载模板
- 如何查找和阅读综述性的文章
- Java 文档注释属性详解
- pmd CamBoard PICO flexx 相机使用心得-64位win7,VS2013开发
- 导出excel
- stm32zet6将温度数据上传至yeelnk服务器,电脑上位机查看
- centos7安装ifconfig命令