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放进去 类似就是这样的吧 ,具体的有什么问题也不是很清楚了,知道的话可以直接留言给我,谢谢!



原创粉丝点击