伟大的GCD和NSOperationQueue

一、 GCD

GCD中最重要的两个东西 任务 和 队列

任务就是一段代码(用来缓存,下载,计算等操作)

队列从大的方面分为两个队列:主队列(串行队列)和 自己创建的队列(串行,和并行)

主队列中:

在主队列中不能开启新的线程出来(所以同步和异步的效果是一样的,但是按钮会回弹上来,变成可以点击的样子,但是实际点击了也是无效的)

在主队列中,不能执行同步的方法,主线程的方法执行完,才会执行主线程方法里的主线程方法,这样就会两个任务互相等待! 而异步就可以把主任务暂时挂起,先执行完主线程的任务,然后在执行主线程的任务中的主线程任务

在自己创建的队列中

串行:遵循FIFO(先进先出原则)

并行:也遵循FIFO原则,但是有所不同

其中任务的执行又分成两种方式

同步执行:(sync) 同步执行只会在当前队列的主线程中执行,并不会另开一个线程

异步执行:(async)异步执行则会另外开一个线程,并不会再主线程中执行

两个特性决定了同步执行容易堵塞线程,而且当同步执行时,其他的操作都不能进行

或者说同步执行他会阻塞当前线程要等待当前任务执行完才会继续往下执行,但是异步执行的话就会执行下去,不会阻塞线程

应该就是上述图的样子233

两种队列和两种执行方式交叉共有4个形式

串行同步:在串行队列的线程中执行任务,不执行完一个任务,不能继续下一个任务(而且按钮在任务完成以前是不会回弹成可点击的样子)

串行异步:在串行队列中开启一个子线程进行任务,在第一个任务执行完成之前,不能执行下一个任务,但是不会干扰启动主线程的任务

并行同步:同步是不具备开,子线程的能力的,但是并行只有开起子线程的时候才能起作用,所以并行同步,没有意义就像串行同步

并行异步: 可以开启多个子线程进行任务,并且不会干扰启动主线程任务

这里的不会干扰启动主线程任务是由队列的主线程是否执行任务来决定的。

因为比较难以理解,所以苹果就自己封装了一个类NSOperationQueue

 //操作属于模型层,不分主线程和子线程。
    NSInvocationOperation *IO = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downLoadImage) object:nil];
    //操作需要添加到操作队列里面,操作队列就会自动添加到子线程中(可以开启多条子线程来执行任务)
    //操作队列只需要添加 操作进来,开启多少条子线程不需要管,什么时候回收也不需要管,但是需要我们人为的创建操作,并且需要创建队列。
     NSOperationQueue *queue = [[NSOperationQueue alloc] init];

    [queue addOperation:IO];

    NSBlockOperation *BO = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"%@, %d",[NSThread currentThread], [NSThread isMainThread]);
    }];
    [queue addOperation:BO];

相对于GCD,这个就比较好理解和管理了。

时间: 2024-08-09 02:19:03

伟大的GCD和NSOperationQueue的相关文章

IOS 多线程02-pthread 、 NSThread 、GCD 、NSOperationQueue、NSRunLoop

注:本人是翻译过来,并且加上本人的一点见解. 要点: 1.前言 2.pthread 3.NSThread 4.Grand Central Dispatch(GCD) 5.Opearation Queues 6. Run Loops 7. 多线程编程中面临的挑战 8. 资源共享 9. 互斥锁 10. 死锁 11. 资源饥饿(Starvation) 12. 优先级反转 1. 前言 其实把RunLoop叫做多线程不正确,因为它不能真正的并行,不过因为它与并发编程有莫大关系,所以值得我们深入了解. 2.

gcd和NSOperationQueue区别

NSOpertaionQueue用GCD构建封装的,是GCD的高级抽象.GCD仅仅支持FIFO队列,而NSOperationQueue中的队列可以被重新设置优先级,从而实现不同操作的执行顺序调整.GCD不支持异步操作之间的依赖关系设置.如果某个操作的依赖另一个操作的数据(生产者-消费者模型是其中之一),使用NSOperationQueue能够按照正确的顺序执行操作.GCD则没有内建的依赖关系支持.NSOperationQueue支持KVO,意味着我们可以观察任务的执行状态. 了解以上不同,我们可

GCD与NSOperationQueue

1> GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本封装 2> GCD只支持FIFO(先入先出)的队列,NSOperationQueue可以很方便地调整执行顺序.设置最大并发数量 3> NSOperationQueue可以在轻松在Operation间设置依赖关系,而GCD需要写很多的代码才能实现 4> NSOperationQueue支持KVO,可以监测operation是否正在执行(isExecuted).是否结束(isFinished),是否取

通过GCD、NSOperationQueue队列、NSThread三种方法来创建多线程

#import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UILabel *remindLabel; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view,

IOS中的多线程【二】— NSOperation和NSOperationQueue

NSOperationQueue是一套基于Objective-c语言的API. GCD与NSOperationQueue的优缺点: NSOperationQueue:比较安全 GCD:没有NSOperationQueue安全,但使用起来简单,快速,还提供了一些操控底层的方法.实际开发中还是以GCD为主. NSOperationQueue实现多线程流程 1.定义一个任务队列. 2.定义一个任务. 3.把任务添加到队列中.一旦任务被添加到队列中,任务会马上被调度执行. 任务队列(NSOperatio

gcd 控制线程执行顺序(供参考)

dispatch_group_t group = dispatch_group_create(); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程一 }); dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ // 并行执行的线程二 }); dispatch_group_notify(group, dispatch_get_

GCD内部实现

Dispatch Queue Dispatch Queue 对于我们开发者来说应该是非常熟悉了,运用的场景非常之多,但是他的内部是如何实现的呢? 用于管理追加的Block的C语言层实现的FIFO队列 Atomic函数中实现的用于排他控制的轻量级信号 用于管理线程的C语言层实现的一些容器 不难想象,GCD的实现需要使用以上这些工具,但是如果仅用这些内容便可实现,那么就不需要内核级实现了.(实际上在一般的Linux内核中可能使用面向Linux操作系统而移植的GCD). 甚至有人会想,只要努力编写线程

GCD 以及设计模式

多线程编程 在 iOS 编程中,这几种情况下需要处理多线程:UI 事件必须在主线程里进行,其他的可以放在后台进行:而进行一些耗时长或阻塞线程的任务,最后放进后台线程里进行.iOS 的多线程技术有这么几种:线程,GCD 和 NSOperationQueue.线程这种技术比较复杂,而多线程编程向来是「复杂必死」,推荐尽可能使用后二者,但线程有个后二者没有的优势:能够精确保证任务执行的时间.GCD 全称是 Grand Central Dispatch, 是 libdispatch 这个库的外部代号,基

iOS- dispatch_semaphore和NSOperationQueue并发

并发:同一个时间内运行多个任务.又叫共行性,是指处理多个同时性活动的能力. 并行:是指两个并发的任务同时发生. 并发不一定并行,并发不一定要同时发生. 举个例子: 有两个快递分别要送到目的地,有以下两种方案: (1)一个快递员分别把两个快递送到对应的目的地.(并发) (2)两个快递员同时送一个快递到目的地.(并行) 在iOS中,经常可以看见有这样的需求,就是一个方法要等另外一个方法执行完毕再做相对应的处理,比如说一些网络请求,需要根据上一个请求的返回值做相对应的处理再执行第二个请求,所以我们不能