iOS多线程编程NSOperation和NSOperationQueue

1.简介

NSOperation是基于GCD封装的OC形式的API。用于创建任务。它是一个抽象类,它的使用方法是必须使用NSOperation的子类。
NSOperationQueue封装了线程的管理 可以管理队列中任务的并发数量,执行顺序,队列的暂停开启等。

2.NSOperation创建任务

NSOperation的使用方法是必须使用NSOperation的子类

1.NSInvocationOperation

NSInvocationOperation定义的调用操作是在主线程中执行的

  // NSInvocationOperation定义的调用操作是在主线程中执行的
  NSInvocationOperation *invocationOperation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(invocationMehtod) object:nil];
//开始任务
[invocationOperation start];

    // 任务取消
//    [customOperation cancel];

2.NSBlockOperation

创建blockOperation 添加一个任务,该任务是在主线程中执行的;当任务数大于1时,其余任务都是在分线程中执行的

    // 创建blockOperation 添加一个任务,该任务是在主线程中执行的;当任务数大于1时,其余任务都是在分线程中执行的
 NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"任务1");
    }];
  // 以block形式添加任务
   [blockOperation addExecutionBlock:^{
        NSLog(@"任务2");
  //开始任务
[blockOperation start];
    // 任务取消
//    [customOperation cancel];

3.自定义NSOperation子类

自定义一个继承与NSOperation的子类重写初始化方法,以Block形式添加任务


#import "LLOperation.h"

@interface LLOperation ()

@property (nonatomic, copy) void(^operationBlock)(id obj);

@end

@implementation LLOperation

- (instancetype)initWithExectionBlock:(void(^)(id obj))block
{
    self = [super init];
    if (self) {
        self.operationBlock = block;
    }
    return self;
}
// main是主要处理任务的方法
- (void)main
{
    self.operationBlock(nil);
}
@end

用自定义的类创建任务

  LLOperation *customOperation = [[LLOperation alloc] initWithExectionBlock:^(id obj) {
        NSLog(@"自定义NSOperation子类创建的任务");
    }];
    //开始任务
 [customOperation start];

    // 任务取消
//    [customOperation cancel];

3.NSOperationQueue操作队列

把NSOperation子类对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象的任务,直到这个对象的所有操作完成,然后它被队列释放。

1.创建队列向队列中添加任务

   // 创建queue
    NSOperationQueue queue  = [[NSOperationQueue alloc] init];
    // 向队列中添加操作  任务自动开始执行
    [queue addOperation:customOperation];
    [queue addOperation:invocationOperation];
    // 将操作添加到队列中 该操作就是在分线程中执行的

2.设置队列的最大并发数


    self.queue.maxConcurrentOperationCount = 4;

3.一次性向队列中添加多个操作,数组中存放的是NSO NSOperation子类对象


    // 1.装有多个操作的数组 2.是否等待队列中的任务执行完毕 如果为YES会阻塞当前线程
   [self.queue addOperations:array waitUntilFinished:NO];

4。取消所有操作

    [self.queue cancelAllOperations];

5.任务暂停、开始

//任务开始
  [queue setSuspended:YES];
//任务继续
  [queue setSuspended:NO];

6.管理队列中任务的执行顺序,添加依赖

  NSOperationQueue *queue = [NSOperationQueue new];
    NSMutableArray *array2 = [NSMutableArray array];
    NSBlockOperation *tmpOperation = nil;
    for (int i=0; i<5; i++) {
        NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"任务%d",i);
            // 模拟执行任务
            [NSThread sleepForTimeInterval:3];
        }];

        //tmpOperation存在
        if (tmpOperation) {
            // 添加依赖,blockOperation的完成依赖于tmpOperation,tmpOperation完成后才执行blockOperation
            [blockOperation addDependency:tmpOperation];
        }
        // 保存一下上次创建的operation
        tmpOperation = blockOperation;

        [array2 addObject:blockOperation];
    }

    [queue addOperations:array2 waitUntilFinished:NO];

输出结果:
iOS多线程编程NSOperation和NSOperationQueue_第1张图片

你可能感兴趣的:(iOS之多线程,ios,多线程,编程)