iOS 学习笔记一 多线程之NSOperation

一、定义:

GCD是基于C的底层API,而NSOperation则是封装GCD实现Objective-C API

NSOperationQueue【操作队列】:用来存放操作的队列

NSOperationQueue有两种不通类型的队列:主队列和自定义队列。主队列在主线程上运行,而自定义队列在后台执行。这两种队列中加入的任务都需要用NSOperation的子类来表示

二、使用

主要步骤: 第一步、创建队列 ;
第二步、创建任务;
第三步、 添加依赖;
第四步 、将任务添加到队列中 。

第一步创建队列

队列的类型:主队列和自定义队列

1、主队列

NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

2、自定义队列

==注意: 自定义队列里的任务,可以通过设置操作队列的 maxConcurrentOperationCount的值来控制操作的串行执行还是并发执行 当maxConcurrentOperationCount = 1的时候,是串行执行。 maxConcurrentOperationCount > 1的时候是并发执行,但是这个线程开启的数量最终还是由系统决定的==

 NSOperationQueue *customQueue = [[NSOperationQueue alloc]init];
 customQueue.maxConcurrentOperationCount = 5;

第二步创建队列操作

两种方式 NSInvocationOperation NSBlockOperation的使用

第一种:NSInvocationOperation

NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(task:) object:@"1"];

- (void)task:(NSString *)order{}

第二种:NSBlockOperation

NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        [self task:@"2"];
    }];

扩展:一个队列操作可以持续添加操作。一个操作中多次添加任务的话,系统会开启新的线程,并发执行操作中的任务。

 NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        [self task];
    }];
    
 [op addExecutionBlock:^{
        [self task:@"add1"];
    }]; 
    
 [op addExecutionBlock:^{
        [self task:@"add2"];
    }];     

第三步添加依赖 和优先级

==注意:1、如果添加了依赖关系,在主队列串行执行任务,也不是先进先出的规则。而是按照依赖关系的属性执行。 应该把操作的所有配置都配置好后,再加入队列,因为加入队列后,操作就开始执行了 2、不能设置双向依赖,如果op1依赖op2,op2又反过来依赖op1,则会出现互相等待的死锁情况 3==

[op1 addDependency:op2];
[op2 addDependency:op3];

第四步 将任务添加到队列中

[customQueue addOperation:op1];

你可能感兴趣的:(iOS 学习笔记一 多线程之NSOperation)