• 多线程下的NSOperation和NSOperationQueue的使用


    多线程下的NSOperation和NSOperationQueue的使用

    NSOperation和NSOperationQueue的介绍:

    NSOperationCocoa中的一个抽象类,用来封装单个任务和代码执行一项操作,由于是抽象类,所以不能直接实例化使用,必须定义子类继承该抽象类来实现,比较常用的NSOperation的子类有NSInvocationOperation,另外,也可以自己继承NSOperation来实现线程的操作。

    NSOperationQueue,它相当于一个线程队列或者可以叫做线程池。可以顺序执行队列中的操作,也可以设置队列中操作的优先级。

    将上述这两个类配合起来使用,就可以实现多线程编程了。

    NSOperation的使用:

    NSOperation的两个子类的设置事件的方法:
    NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(selector:) object:nil];
    
    NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init];
    [blockOperation addExecutionBlock:^{
            NSLog(@"1st the thread is %@", [NSThread currentThread]);
        }];
    
    [operation1 start];

    第一个是使用NSInvocationOperation来设置事件。

    第二个是使用NSBlockOperation来设置事件,事件在代码开中设置。

    第三个是单独开启某个NSOperation子类的事件的方法。

    NSOperationQueue的使用:

     NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    
     [queue addOperation:operation1];
    
     [operation1 addDependency:operation2];<span style="white-space:pre">	</span>
    <span style="color: rgb(52, 52, 52); font-family: 'Source Code Pro', monospace; font-size: 16.2000007629395px; white-space: pre-wrap;">[NSOperationQueue mainQueue]</span>
    

    第一个方法:创建和初始化队列

    第二个方法: 添加事件,如果事件添加了,那么程序就直接运行了

    第三个方法:事件的先后顺序设置

    第四个方法:获取主队列


    使用上述方法实例

    @implementation NSOperationController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        [self.view setBackgroundColor:[UIColor whiteColor]];
        
    //    [self invocationOperation1];
    }
    
    #pragma mark detail method
    -(void) invocationOperation1{
    //    使用NSInvocationOperation类来设置事件
        NSInvocationOperation *operation1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(logTheOperation:) object:@"this is the frist invovationOpration"];
        NSInvocationOperation *operation2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(logTheOperation:) object:@"this is the second invocationOperation"];
        
    //    使用NSBlockOperation来设置事件,并且添加事件
        NSBlockOperation *blockOperation = [[NSBlockOperation alloc] init];
        [blockOperation addExecutionBlock:^{
            NSLog(@"1st the thread is %@", [NSThread currentThread]);
        }];
        [blockOperation addExecutionBlock:^{
            NSLog(@"2st the thread is %@", [NSThread currentThread]);
        }];
        [blockOperation addExecutionBlock:^{
            NSLog(@"3st the thread is %@", [NSThread currentThread]);
        }];
        
    //    在这里我们还可以设置事件的先后顺序,这样一设置,运行顺序应该是blockOperation->operation1->operation2
        [operation1 addDependency:operation2];
        [blockOperation addDependency:operation2];
        
        
    //    初始化一个队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    //    将事件添加到队列中
        [queue addOperation:operation1];
        [queue addOperation:operation2];
        [queue addOperation:blockOperation];
    
        
    //    用另一种方法来存放事件
    //    [operation1 start];
    //    [operation2 start];
    //    [blockOperation start];
        
    }
    
    -(void) logTheOperation:(NSString *)log
    {
        NSLog(@"%@the thread is %@",log, [NSThread currentThread]);
    }
    @end
    
    



  • 相关阅读:
    HotSpot VM执行引擎的实现
    解释器与JIT编译器
    执行引擎(Execution Engine)基础知识
    堆、栈、方法区的详细图解
    方法区的垃圾回收
    方法区的演进
    方法区的内部结构
    方法区内存配置
    设计模式简记-设计原则之迪米特法则
    设计模式简记-设计原则之DRY原则
  • 原文地址:https://www.cnblogs.com/AbeDay/p/5026949.html
Copyright © 2020-2023  润新知