美文网首页
NSOpeartion基础使用

NSOpeartion基础使用

作者: 邓布利多教授 | 来源:发表于2019-07-18 16:24 被阅读0次

1、使用NSInvocationOperation创建执行操作

在当前主线程执行,没有开辟新线程

#pragma mark - 使用NSInvocationOperation
-(void)useInvocation{
    
    NSInvocationOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
    [op start];
    
}

-(void)op1Action{
    for (int i = 0; i < 2; i ++) {
        [NSThread sleepForTimeInterval:2];
        NSLog(@"1 ------ %@",[NSThread currentThread]);
    }
}

2、使用NSBlockOperation创建执行操作

在当前主线程执行,没有开辟新线程

#pragma mark - 使用NSBlockOperation
-(void)useBlock{
    
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2 ------ %@",[NSThread currentThread]);
        }
        
    }];
    
    [op start];
}

3、使用addExecutionBlock方法添加更多的执行操作

是否开启新的线程取决于添加执行操作的个数

#pragma mark - 使用useBlockOperationAddExecution
-(void)useBlockOperationAddExecution{
    
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
        
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3 ------ %@",[NSThread currentThread]);
        }
        
    }];
    
    [op addExecutionBlock:^{
        
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"4 ------ %@",[NSThread currentThread]);
        }
        
    }];
    
    [op start];
    
}

4、自定义一个Operation

创建一个继承自Operation的类,重写main方法,调用的时候因为这个类的头文件

.h
#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface CustomOperation : NSOperation

@end

NS_ASSUME_NONNULL_END
.m
#import "CustomOperation.h"

@implementation CustomOperation

-(void)main{
    
    if (!self.isCancelled) {
        
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"5 ------ %@",[NSThread currentThread]);
        }
        
    }
    
}

@end
引入头文件#import "CustomOperation.h",调用!
#pragma mark - 使用自定义NSOperation
-(void)useCustomOpeartion{
    
    CustomOperation *cop = [CustomOperation new];
    [cop start];
    
}

5、使用队列之-NSOperationQueue,创建主队列

不用说都知道,主队列是在当前主线程执行,并且是串行的

#pragma mark - 使用队列之-NSOperationQueue,创建主队列
-(void)createMainQueue{
    
    //创建主队列
    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    //创建线程
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
    
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3 ------ %@",[NSThread currentThread]);
        }
    }];
    
    //添加线程到队列
    [queue addOperation:op1];//相当于[op star];
    [queue addOperation:op2];
    [queue addOperation:op3];
    
}

6、使用队列之-NSOperationQueue,创建子队列

这里也是,既然是子队列,肯定是在子线程执行的,而且是并发的
这里有一点说明,把线程添加到队列有两种方式:1、addOperation;2、blockOperationWithBlock
创建子队列这里两种方式我都写出来了

#pragma mark - 使用队列之-NSOperationQueue,创建子队列
-(void)createSubQueue{

    //子队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
//    //创建线程
//    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
//    NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
//
//    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
//        for (int i = 0; i < 2; i ++) {
//            [NSThread sleepForTimeInterval:2];
//            NSLog(@"3 ------ %@",[NSThread currentThread]);
//        }
//    }];
//
//    //添加线程到队列
//    [queue addOperation:op1];//相当于[op star];
//    [queue addOperation:op2];
//    [queue addOperation:op3];
    
#pragma arguments --------------------
    
    [queue addOperationWithBlock:^{
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"1 ------ %@",[NSThread currentThread]);
        }
    }];

    [queue addOperationWithBlock:^{
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"2 ------ %@",[NSThread currentThread]);
        }
    }];

    [queue addOperationWithBlock:^{
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3 ------ %@",[NSThread currentThread]);
        }
    }];

}

7、使用队列之-NSOperationQueue,控制串行和并发

在NSOperationQueue下,有个属性,叫做maxConcurrentOperationCount,我们可以用这个属性来控制串行或者并发,怎么控制呢?取决于maxConcurrentOperationCount的值,这个属性是一个基本数据类型的,所以,它等于1的时候就是串行,大于1的时候就是并发

#pragma mark - 使用队列之-NSOperationQueue,控制串行和并发
-(void)useOperationCount{
    
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
//    queue.maxConcurrentOperationCount = 1;//串行
    queue.maxConcurrentOperationCount = 2;//并发
    
    //创建线程
    NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op1Action) object:nil];
    NSInvocationOperation *op2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(op2Action) object:nil];
    
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        for (int i = 0; i < 2; i ++) {
            [NSThread sleepForTimeInterval:2];
            NSLog(@"3 ------ %@",[NSThread currentThread]);
        }
    }];
    
    //添加线程到队列
    [queue addOperation:op1];//相当于[op star];
    [queue addOperation:op2];
    [queue addOperation:op3];
    
}

8、通信

怎么理解呢?就是平时的那种处理数据,然后刷新UI。平时不都是在子线程处理数据啥的,完事之后回到主线程更新UI吗?我说的就是这个意思,这里我为了方便,写了一个GCD用来个NSOperation对比

#pragma mark - 模拟网络请求,刷新UI
-(void)requestDataAndRefreshUI{
    
#pragma arguments - NSOperation
//    //异步子线程请求数据
//    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//
//    [queue addOperationWithBlock:^{
//
//        for (int i = 0; i < 10; i ++) {
//
//            NSLog(@"iiii = %d",i);
//            sleep(1);
//
//            if (i == 5) {
//
//                NSOperationQueue *queMian = [NSOperationQueue mainQueue];
//
//                [queMian addOperationWithBlock:^{
//                    NSLog(@"刷新UI");
//                }];
//
//            }
//
//        }
//
//    }];
    
#pragma arguments - GCD
    
//    dispatch_async(dispatch_get_global_queue(0, 0), ^{
//
//        for (int i = 0; i < 10; i ++) {
//
//            NSLog(@"iiii = %d",i);
//            sleep(1);
//
//            if (i == 5) {
//
//                dispatch_async(dispatch_get_main_queue(), ^{
//                    NSLog(@"刷新UI");
//                });
//
//            }
//
//        }
//
//    });
    
}

9 、全剧终

有错误的地方欢迎指出,拜谢!

相关文章

网友评论

      本文标题:NSOpeartion基础使用

      本文链接:https://www.haomeiwen.com/subject/fgvllctx.html