JHHK

欢迎来到我的个人网站
行者常至 为者常成

NSOperation

目录

NSOperation 底层是GCD,比GCD多了一些简单实用的功能,使用更加面向对象。

同步

在当前线程执行任务

//invocationOperation
NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_test) object:nil];
[operation start];
//blockOperation
__weak typeof(self) weakSeal = self;
NSBlockOperation * blockOperation = [NSBlockOperation blockOperationWithBlock:^{
    [weakSeal _test];
}];
[blockOperation start];

异步

1.异步使用

//异步并发队列的封装
NSOperationQueue * concurrentQueue = [[NSOperationQueue alloc] init];

//创建一个操作任务
NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_test) object:nil];

//添加到队列后 会直接开启新线程执行
[concurrentQueue addOperation:operation];

2.队列的最大并发数

//最大并发数
NSOperationQueue * concurrentQueue = [[NSOperationQueue alloc] init];
//concurrentQueue.maxConcurrentOperationCount = 1;//最大并发数为1 可同时执行1个任务 串行队列
concurrentQueue.maxConcurrentOperationCount = 2;//最大并发数为2 可同时执行2个任务
//concurrentQueue.maxConcurrentOperationCount = 3;//最大并发数为3 可同时执行3个任务

//添加到队列里就会执行
[concurrentQueue addOperationWithBlock:^{
    NSLog(@"block1-耗时操作");
}];

[concurrentQueue addOperationWithBlock:^{
    NSLog(@"block2-耗时操作");
}];

[concurrentQueue addOperationWithBlock:^{
    NSLog(@"block3-耗时操作");
}];

//PS:重要说明
//最大并发数并不是指开辟线程的数量,而是指同时执行的操作数的数量

3.队列的挂起

-(void)operation_suspend{
    NSOperationQueue * concurrentQueue = [[NSOperationQueue alloc] init];
    [concurrentQueue addOperationWithBlock:^{
        NSLog(@"lilog - 耗时操作");
    }];
    concurrentQueue.suspended = YES;//挂起队列
    concurrentQueue.suspended = NO;//取消队列挂起
}

4.队列的取消

//队列的取消
-(void)operation_cancel{
    NSOperationQueue * concurrentQueue = [[NSOperationQueue alloc] init];
    [concurrentQueue addOperationWithBlock:^{
        NSLog(@"lilog - 耗时操作");
    }];
    [concurrentQueue cancelAllOperations];//取消队列
}

其它

1.子线程回主线程

//线程间通讯
NSOperationQueue * concurrentQueue = [[NSOperationQueue alloc] init];
[concurrentQueue addOperationWithBlock:^{
    NSLog(@"lilog - 耗时操作");
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
        NSLog(@"lilog - 回到主线程-%@",[NSThread currentThread]);
    }];
}];

2.操作任务间的依赖关系

-(void)operation_dependency{
    NSBlockOperation * operation1 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i<10; i++) {
            NSLog(@"thread = %@ i = %d",[NSThread currentThread],i);
        }
    }];
    
    NSBlockOperation * operation2 = [NSBlockOperation blockOperationWithBlock:^{
        for (int j = 0; j<10; j++) {
            NSLog(@"thread = %@ j = %d",[NSThread currentThread],j);
        }
    }];
    
    NSBlockOperation * operation3 = [NSBlockOperation blockOperationWithBlock:^{
        for (int k = 0; k<10; k++) {
            NSLog(@"thread = %@ k = %d",[NSThread currentThread],k);
        }
        
    }];
    
    //操作之间的执行关系  切记:不可添加循环的依赖关系
    [operation2 addDependency:operation1];//operation2 需要在 operation1执行完之后再执行
    [operation3 addDependency:operation2];//operation3 需要在 operation2执行完之后再执行
    
    //创建一个队列
    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
    [queue addOperation:operation1];
    [queue addOperation:operation2];
    [queue addOperation:operation3];
    
    //此代码会保证queue内所有的任务都执行完之后再执行其后代码
    [queue waitUntilAllOperationsAreFinished];
    NSLog(@"come here");
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.