[Object-C]CGD&NSOperation

来源:互联网 发布:地图矢量化软件工具 编辑:程序博客网 时间:2024/06/07 20:21
一、GCD
1、并发队列开多条线程,具体能开的线程数量由底层线程池决定。iOS7.0以及之前,GCD通常只会开启5-6条线程,iOS8.0之后,GCD能够开启非常多的线程(八十多条)。
2、如果任务没有先后执行顺序的要求,并且需要效率高,执行快,那么可以使用多线程。缺点是:费电,而且耗流量。适用于wifi或者包月的流量。
3、实际开发中,wifi线程数6条,3G / 4G 移动开发的时候,2~3条,再多会费电费钱!
4、GCD与NSThread的对比
   4.1 GCD所有的代码写在一起,让代码更加简单,易于阅读和维护。NSThread通过@selector指定要执行的方法,代码分散。GCD通过block指定要执行的代码,代码集中。 
   4.2 使用GCD不需要管理线程的创建/销毁/复用的过程!程序员不用关心线程的生命周期。
   4.3 如果要开多个线程NSThread必须实例化多个线程对象。
   4.4 NSThread靠NSObject的分类方法实现线程间的通讯,GCD靠block。
5、串行队列:以先进先出的方式,顺序调度队列中的任务执行。无论队列中所指定的执行任务函数是同步还是异步,都会等待前一个任务执行完成后,再调度后面的任务。
6、主队列:主队列是专门用来在主线程上调度任务的队列,不会开启线程。它以先进先出的方式,在主线程空闲时才会调度队列中的任务在主线程执行。如果当前主线程正在有任务执行,那么无论主队列中当前被添加了什么任务,都不会被调度。
7、死锁:当存在同异步嵌套时,当内部嵌套是同步,并且与外层嵌套执行的是同一个串行队列时,会死锁。
8、同异步决定开不开线程,串行和并行决定开启的线程数。同步不开线程,异步开线程。异步执行串行队列时,开启一条线程。异步执行并发队列时,可开启多条线程,无序。
9、同步任务的作用:可以让其他异步执行的任务,放在某一个同步的任务后面。如登录后开启下载功能。
10、全局队列&并发队列的区别:全局队列是系统提供的并发队列之一,系统提供了四种系统级的并发队列,其中全局队列的优先级最高。所以全局队列也是并发队列的一种。它与全局队列的区别是:全局队列没有名称,无论MRC&ARC都不需要考虑释放,日常开发中,建议使用“全局队列”。并发队列有名字,如果是在MRC开发时,需要使用dispatch_release(q);释放相应的对象。dispatch_barrier时必须使用自定义的并发队列,开发第三方框架时,建议使用并发队列。
11、调度组和Barrier的区别:
    调度组相当于把所有任务都添加到组里面,当组里面的任务执行完毕(空了)的时候,再通知一下。
     Barrier:相当于把所有任务都执行完成后,用一个串行队列进行阻塞。当所有任务都完成后,再排队一个一个执行dispatch_barrier_async中的block方法。

12、补充:信号量
可以在GCD中限制最大并发线程。当参数为1时可以用来当锁使用,相当于banarry或者串行。
- (void)mul
{
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(2);

    for (int i = 0; i < 100; i++) {
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
        dispatch_async(dispatch_get_global_queue(0, 0), ^{
            //[NSThread sleepForTimeInterval:2];
            NSLog(@"%@------%zd",[NSThread currentThread],i);
            dispatch_semaphore_signal(semaphore);
        });
    }
}


二、NSOperation
1、NSOperation是一个抽象类,它有NSInvocationOperation和NSBlockOperation两个子类,一个调用 方法,一个调用block。一般NSOperation都是添加到一个NSOperationQueue中。添加到NSOperationQueue中默认是异步执行,如果不添加则在当前主线程执行。
 2、 NSOperationQueue可以调用 mainQueue进行线程间通讯。
 3、常用属性:
self.queue.maxConcurrentOperationCount = 2; //设置同时最大并发操作数
self.queue.suspended = !self.queue.isSuspended;  // 暂停或者继续
[self.queue cancelAllOperations]; 取消队列中的全部操作,不会影响正在执行的操作
[op2 addDependency:op1]; // 前面的op2在op1后面执行。(依赖操作)

4、GCD与NSOperation的区别:
4.1 GCD用于将任务(block)添加到队列(串行、并发、主队列)中,并且指定任务执行的函数(同步/异步)。NSOperation是将操作(异步)添加到队列(全局的并发队列)中。
4.2 GCD的底层是C语言构成的API。NSOperation是OC框架,更加面向对象,它是对GCD的封装。
4.3 GCD是4.0推出的,针对多核处理器的并发技术。NSOperation是2.0推出的,苹果推出GCD后,对NSOperation的底层用GCD全部进行重写。
4.4 GCD在队列中执行的是由block构成的任务,这是一个轻量级的数据结构。NSOperation根据子类的不同,可以执行方法或者block。
4.5 GCD要停止已经加入queu的block需要写复杂的代码,NSOperation可以随时取消已经设定要准备执行的任务,已经执行的除外。
4.6 GCD需要通过 Barrier或者同步任务设置任务之间的依赖关系,只能设置队列的优先级。NSOperation可以跨队列设置操作的依赖关系,可以设置队列中每一个任务的优先级。
4.7 GCD的高级功能有:一次性once,延迟操作after,调度组。
      NSOperation可以设置最大的操作并发数(GCD不好做),设置继续、暂停、全部取消。跨队列设置操作的依赖关系。



原创粉丝点击